【问题标题】:.load performance issue when using in interval.load 间隔使用时的性能问题
【发布时间】:2014-04-28 21:20:31
【问题描述】:

我有一个 php 应用程序,我每 2 分钟将大量内容加载到 div 中。浏览器(我必须为 IE8 构建它)通常在重新加载数据几分钟后开始变慢。 我已经知道原因了——只要页面本身被加载,内存就不会删除之前加载的数据。

有没有办法做到这一点,以便在几次/多次重新加载后内存不会被淹没?

我发现了这个:

jQuery load() method memory leak?

在这里给出很酷的答案(见完整线程https://stackoverflow.com/a/2180355/3424808):

这不是一个完整的答案,但我很快找到了如何以最少的更改来修复我的所有代码。在我的“基础”js 类中(这是一个在每个页面上用于按类名等进行标准按钮连接的对象)我添加了以下方法来检查欺骗处理程序:

    BindOnce: function(triggerName, fn) {
    function handlerExists(triggerName, theHandler) {
        function getFunctionName(fn) {
            var rgx = /^function\s+([^\(\s]+)/
            var matches = rgx.exec(fn.toString());
            return matches ? matches[1] : "(anonymous)"
        }
        exists = false;
        var handlerName = getFunctionName(theHandler);
        if ($(document).data('events') !== undefined) {
            var event = $(document).data('events')[triggerName];
            if (event !== undefined) {
                $.each(event, function(i, handler) {
                    if (getFunctionName(handler) == handlerName) {
                        exists = true;
                    }
                });
            }
        }
        return exists;
    }
    if (!handlerExists(triggerName, fn)) {
        $(document).bind(triggerName, fn);
    }
}

然后我只是调用它而不是绑定方法!

但我无法让它工作(当我重写简单的工作 .bind() fn 时它停止工作)。 有没有其他方法可以实现这一目标?

或者有人可以帮我处理我发布的脚本吗?当我将它分配给按钮时什么都不做。 我使用如下功能:

$('#myButtonID').BindOnce("click", function() {
  alert( "User clicked on 'foo.'" );
});

适用于简单的 .bind()

编辑

这是让我丧命的原始 .load()。

<script type="text/javascript">
var skill = <?php echo json_encode($skill_, JSON_UNESCAPED_UNICODE); ?>;
var skill_final = <?php echo json_encode($skill_final, JSON_UNESCAPED_UNICODE); ?>;
var camp_final = <?php echo json_encode($camp_final, JSON_UNESCAPED_UNICODE); ?>;
var jmeno = <?php echo json_encode($jmeno_, JSON_UNESCAPED_UNICODE); ?>;
var pozice = <?php echo json_encode($pozice_, JSON_UNESCAPED_UNICODE); ?>; 
var delka = <?php echo json_encode($delka_, JSON_UNESCAPED_UNICODE); ?>;
var opravneni = <?php echo json_encode($opravneni, JSON_UNESCAPED_UNICODE); ?>;

$(document).ready(function(){
  refreshPrehled();
});
function refreshPrehled(){
  $('#checkboxes').load('load_prehled.php', {
    skill: skill,
    skill_final: skill_final,
    camp_final: camp_final,
    jmeno: jmeno,
    pozice: pozice,
    delka: delka,
    opravneni: opravneni
  }, function(){
    setInterval(refreshPrehled, 120000);
  });
}
</script>

【问题讨论】:

  • Reloading 建议您多次加载相同的数据。你不能在服务器上跟踪已经加载的内容并且只发送新的/更改的内容吗?
  • @jeroen 我有一个脚本,它每 2 分钟用更新的数据重写几个 .txt,并在此基础上重构表。
  • 你能展示你实际使用的代码吗?你用的是什么版本的jQuery?目前这看起来像一个 x/y 问题,你有问题 x,并试图用 y 解决它,并试图找出为什么 y 在你真正应该查看 x 时不起作用。 meta.stackexchange.com/questions/66377/what-is-the-xy-problem
  • @Kevin B 好点,我添加了原始的 .load() 脚本,这让我很麻烦。 JQ 1.8.2
  • 看,现在我立即看到了问题。每 120000 毫秒,您将开始一个新的 setInterval。所以第一次发生它会运行 ajax 一次,第二次运行两次,第三次运行 4 次,依此类推。

标签: javascript php jquery


【解决方案1】:

您在每次调用函数时都重新创建setInterval,您应该改用setTimeout。使用您当前的代码,该函数的第一次调用将发送一个 ajax 请求,然后在 120000ms 之后将执行两次,然后在 120000ms 之后将执行 4 次,依此类推。使用setTimeout 会阻止它,因为它只执行一次函数。

$(document).ready(function(){
    refreshPrehled();
});
function refreshPrehled(){
    $('#checkboxes').load('load_prehled.php', {
        skill: skill,
        skill_final: skill_final,
        camp_final: camp_final,
        jmeno: jmeno,
        pozice: pozice,
        delka: delka,
        opravneni: opravneni
    }, function(){
        setTimeout(refreshPrehled, 120000);
    });
}

【讨论】:

  • 而且使用 setTimeout 不会淹没内存?或者在 30 次重新加载后无论如何都放慢速度?
  • 理论上它不会,当然取决于 load_prehled.php 返回的内容。以较小的延迟(例如 10 秒)对其进行测试,然后在监控内存的同时将其保持一小时。
  • yee... 我之前在那里有超时,但它不适用于页面的其他部分,所以我尝试了不同的间隔调用,可能误读了情况。谢谢你的帮助队友! :) 在这里保持精彩
  • 你帮了我的忙,还告诉我我整天都在寻找错误问题的正确答案。感谢您的帮助,祝您有美好的一天! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多