0

プロジェクトのコントロール パネルを開発していますが、コードの一部と競合しています。すべてのリンクが要求されたページのコンテンツを DIV に挿入するように、いくつかの jQuery を実行しています。このコードは index.php ページに配置されているため、何があってもページの最初に実行されます。実際にインデックスから離れることはありません。

$('a').live("click",function(){
var external = $(this).attr('class');
if (external == "externalLink") {
return true;
}
var page = $(this).attr('href');
if (!(page == "#") && (page)) {
    $("#loading").fadeToggle("fast", "linear");
    $("#split-view-right #content").load(page, function(){
        var parentHeader = $("#split-view-right #content #parentHeader").html();
        $("#split-view-right #header").html(parentHeader);  
        $("#loading").fadeToggle("fast", "linear");
    });
}
return false;
});

#header には、いくつかのボタンを含むいくつかのコードも配置されています。それらのいくつかは、ページへのリンクだけでうまく機能しますが、スクリプトを実行する必要があるものもあります。これらのページの 1 つで実行するスクリプトを定義しようとすると、「.live」で実行しない限り、ボタンが見つかりません。問題は、そのライブ スクリプトを実行した後に別のページに移動しようとすると、ハイパーリンクが無視され、そのコードが再度実行されることです。実行中のコードのサンプルを次に示します。

$(function() {
$("#headerbutton").live('click', function() {
    $("#loading").fadeToggle("fast", "linear");
    var title = $("input#title").val();
    var partnum = $("input#partnum").val();
    var descript = $("textarea#descript").val();    
    var startprice = $("input#startprice").val();
    var minprice = $("input#minprice").val();
    var domship = $("input#domship").val(); 
    var intship = $("input#intship").val();
    var startdate = $("input#startdate").val();
    var droprate = $("input#droprate").val();   
    var dataString = 'title='+title+'&partnum='+partnum+'&descript='+descript+'&startprice='+startprice+'&minprice='+minprice+'&domship='+domship+'&intship='+intship+'&startdate='+startdate+'&droprate='+droprate;    
    $.post("savenewproduct.php",
    { "title": title, "partnum": partnum, "descript": descript, "startprice": startprice, "minprice": minprice, "domship": domship, "intship": intship, "startdate": startdate, "droprate": droprate },     
    function(postdata){
        $("#split-view-right #content").load('upload_images.php?id=' + postdata.newID, function(){
            var parentHeader = $("#split-view-right #content #parentHeader").html();
            $("#split-view-right #header").html(parentHeader);  
            $("#loading").fadeToggle("fast", "linear");
        });
    }, "json");
    return false;
});
});

私が試してやりたいこと (より良い解決策がない限り) は、「.load」を実行するたびに「.die」スクリプトを実行して、そのページの以前のライブ コードをキャンセルできるようにすることです。 .

何か案は?

4

4 に答える 4

1

あなたの詳細を十分に理解しているかどうかはわかりませんが、ここから私が得たものは次のとおりです。

まず、要件.one()がなければ、ここであなたの後ろを救ったように思え.live()ます。を利用できるようにコードをリファクタリングできれば.one()、それは素晴らしいことです。

それがなければ、関数のコールバック.die()に呼び出しを固定しないのはなぜですか? .load()私が見る限り、あなたのコードは基本的に次のとおりです。

$('#headerbutton').live('click', function() {
    // some stuff
    $.post(foo, bar, function () {
        $("#split-view-right #content").load(herp, function () {
             // some stuff
             // some more stuff
             // ...
             // what's stopping you from doing something like this:

             $('#headerbutton').die('click');
        });
    });
});

.live()それはあなたのハンドラを効果的にキャンセルします#headerbutton

于 2011-09-28T18:49:35.493 に答える
1

まず、次のコードを簡略化できます。

$('a').live("click",function(){
  var external = $(this).attr('class');
  if (external == "externalLink") {
    return true;
  }
  ...

になる

$('a:not(.external)').live("click",function(){
  ...

スクリプトのロードの問題に関しては、スクリプトを含むページをロードする場合は、スクリプトが常に変更中の要素の後にあることを確認してください。メインインデックスがロードされたときにイベントがすでにトリガーされている$(function(){});ため、ここでは実際には役に立ちません。DOMReady

于 2011-09-28T18:25:14.397 に答える
1

これが役立つかどうかはわかりませんが、試して使用できます:

$('a:not(.external)').live("click", function(e){
    e.preventDefault();
    ....
}

これにより、ブラウザはデフォルトでリンクをたどることができなくなり、代わりにコードを実行できるようになります。

于 2011-09-28T19:03:59.027 に答える
0

ユーザー入力がload()を生成するものは何でもbind()を使用します

http://api.jquery.com/bind/

于 2011-09-28T18:57:43.037 に答える