【发布时间】: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