0

我正在为一个项目开发一个控制面板,我的一些代码有点冲突。我正在运行一些 jQuery,以便每个链接都将请求页面的内容插入到 DIV 中。此代码位于 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 中,我还放了一些代码,包括一些按钮。其中一些我只是链接到一个页面,效果很好,但有些我需要运行脚本。当我尝试定义要在其中一个页面上运行的脚本时,除非我使用“.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

首先,可以简化以下代码:

$('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

我不确定我是否足够了解您的详细信息,但这就是我从中得到的。

首先,如果不是出于要求,这听起来像是.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:not(.external)').live("click", function(e){
    e.preventDefault();
    ....
}

这将阻止浏览器默认跟踪链接并允许您执行代码。

于 2011-09-28T19:03:59.027 回答
0

我会使用 bind() 来处理任何用户输入产生 load()

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

于 2011-09-28T18:57:43.037 回答