【问题标题】:JS seems to stay in DOM on Ajax reloaded pagesJS 似乎停留在 Ajax 重新加载页面上的 DOM 中
【发布时间】:2012-06-27 10:20:05
【问题描述】:

好的,这是一个奇怪的错误,因为它是第一个没有任何完整重新加载的 ajax 页面这似乎是一个常见的问题。

让我们逐步解决问题: 我有一个页面,其中 Ajax 请求由一个简化的函数触发,如下所示:

$("a[rel='tab']").live('click',function(e) {

pageurl = $(this).attr('href');
$.ajax({url:pageurl+'?rel=tab',success: function(data){
  $('#content').html(data);
}});
if(pageurl!=window.location){
  window.history.pushState({path:pageurl},'',pageurl);
}
e.preventDefault();
return false;
});

这是由 PHP 文件解析的,如果设置了属性,则不会加载设计,而只会加载文件本身 - 容易吗?

好的,现在问题本身 - 很明显,页面随着时间的推移变得越来越慢,但我一开始并没有真正打扰,因为我认为这是设计 javascripts 中的一些错误 - 但事实并非如此。

所以我看了一下萤火虫,我所看到的解释了很多 -> 请求与每个新页面叠加!当然,这会导致矫枉过正......好吧,起初我认为这只是“setInterval”,并运行了一个解决方法,在每次重新加载时重置它们。

但这并不是他们似乎也堆积在“脚本”中的唯一情况,因为我不认为这是一个简单的历史,因为重新加载的脚本不止一次出现!

右边的任何提示都会很有帮助,因为我几乎被困在这里了!

【问题讨论】:

    标签: javascript jquery ajax reload stack


    【解决方案1】:

    好吧,问题似乎只是与 setInterval 相关 - 经过一段时间的尝试,我得出的结论是这是主要问题,它只是萤火虫本身的某种循环。

    但是,也许有人会遇到同样的问题,所以解决方案几乎是这样的: 你必须: 1. 创建一个数组来存储您的区间 2. 以这种方式调用你的 setIntervals 3. 在每个“新窗口”上重置它们

    var intervalArr = new Array();
    
    function killIntervals(){
    while(intervalArr.length > 0)
        clearInterval(intervalArr.pop());
    };
    

    这些是数组和函数

    所以这些应该添加到你的 AJAX 请求函数中:

    killIntervals();
    intervalArr.push(setInterval (yourintervalfunction, 5000));
    

    我希望这对某人有用。

    【讨论】:

    • 您在原始代码中使用setInterval 到底在做什么?您是否定期调用 Ajax 函数?通常你应该避免在 Ajax 中使用setInterval,因为你永远不知道请求什么时候完成。请改用setTimeout 并在成功回调中调用它。这样,您只需要运行一次超时。
    • 如果你设置一个 var 来阻止它直到成功,这不是一个大问题 -> 例如 var blockit = false -> 函数调用 blockit = true -> 成功时 blockit = false - 你可以避免不必要的调用并使用 setInterval 没有任何问题:)。
    猜你喜欢
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多