【发布时间】:2009-02-05 20:46:38
【问题描述】:
让我先说一下实际上是我的糟糕代码泄漏并导致我的浏览器崩溃,我只是想我最好从一开始就尽可能清楚地使用所使用的语言。
我有一个测试页面here,可以在here 找到javascript。我的问题是,当我尝试多次拖放任何一个红色块时,它会占用所有浏览器资源并使浏览器崩溃。我相当确定罪魁祸首是 Tracker() 对象中的以下函数,但我完全不知道如何调试它。
我目前最有可能的罪魁祸首:
function register_draggable(ob) {
ob.config.jqId.draggable({cursor: 'move',
grid:[ob.config.size, ob.config.size],
containment: '#chessboard',
revert: 'invalid',
start: function() {
check_allowable_moves(ob.config.jqLocation,
ob.config.jqId,
ob);
},
stop: function() {
remove_allowable_moves();
}
});
}
如果有人可以快速浏览一下并就我应该寻找什么给我任何建议,我们将不胜感激。
解决方案
原来register_draggable() 是罪魁祸首。每次更新片段的位置并且同一对象上的所有那些可拖动对象都在做讨厌的事情时,我都会注册一个新的可拖动对象。
目前,我现在明确地在创建新的可拖动对象之前销毁旧的可拖动对象。当前代码是
function register_draggable(ob) {
ob.config.jqId.draggable('destroy');
ob.config.jqId.draggable({cursor: 'move',
grid:[ob.config.size, ob.config.size],
containment: '#chessboard',
revert: 'invalid',
start: function() {
check_allowable_moves(ob.config.jqLocation,
ob.config.jqId,
ob);
},
stop: function() {
remove_allowable_moves();
}
});
}
【问题讨论】:
-
让 check_allowable_moves 立即返回,我猜它在里面。
-
哇,是的,它 def 正在泄漏内存,或者它在 5 次移动后导致我的浏览器崩溃。我的猜测是 check_allowable_moves 也可能与它有关。
-
在测试脚本中调用 check_allowable_moves,无需任何拖放操作。看看它的表现。
-
我认为几乎可以肯定添加可拖动的次数太多了。如果我把 ob.config.jqId.draggable('destroy');作为 register_draggable(ob) 的第一行,它工作得更好
-
这个好像很眼熟……
标签: javascript jquery debugging memory-leaks