Javascript 通过显式调用.off()删除jQuery中的.one()事件处理程序是否安全
可以使用Javascript 通过显式调用.off()删除jQuery中的.one()事件处理程序是否安全,javascript,jquery,Javascript,Jquery,可以使用.off()方法删除jQuery中使用.on()添加的事件处理程序。每个事件最多执行一次。是否可以使用.off()方法安全地将其移除(对于拐角处的情况) 更新: 特别想知道如果显式删除自删除事件处理程序,是否会有任何副作用,例如内存泄漏 function loadObject(e){ if $(e.currentTarget).hasClass('condition'){ //Corner case - execute the unload function &a
.off()
方法删除jQuery中使用.on()
添加的事件处理程序。每个事件最多执行一次。是否可以使用.off()
方法安全地将其移除(对于拐角处的情况)
更新:
特别想知道如果显式删除自删除事件处理程序,是否会有任何副作用,例如内存泄漏
function loadObject(e){
if $(e.currentTarget).hasClass('condition'){
//Corner case - execute the unload function & remove the handler
unloadObject();
removeCloseHandler();
}else {
//Do more stuff
addCloseHandler();
}
}
function removeCloseHandler(){
$('body').off('click', unloadObject);
}
function addCloseHandler(myObj){
$('body').one('click', myObj, unloadObject);
}
function addOpenHandler(){
$('#myid').on('click', '.myclass', loadObject);
}
p.S.我知道我可以使用.on()
和.off()
而不是.one()
但是我很好奇.off()
与.one()
的用法
特别想知道如果显式删除自删除事件处理程序,是否会有任何副作用,例如内存泄漏
不会的
这是处理此问题的.on方法的重要部分:
if (one === 1) { // if it was called from `$.fn.one`
origFn = fn;
fn = function (event) {
// Can use an empty set, since event contains the info
jQuery().off(event);
return origFn.apply(this, arguments);
};
// Use same guid so caller can remove using origFn
fn.guid = origFn.guid || (origFn.guid = jQuery.guid++);
}
.on
绑定事件和.one
绑定事件之间的唯一区别是.one
获取一个特殊回调,调用该回调时,该回调将取消绑定事件,然后执行原始回调 我花了十秒钟测试它->,就像你应该做的那样。@adeneo:但是当设置了one
标志时,上的在内部所做的是完全不同的……我的答案代码片段的最后一行处理了他提出的问题。通过将新函数的guid设置为与旧函数相同,使用旧函数解除绑定也会删除使用创建的特殊函数jquery。one@Bergi谢谢你的挑战和深入研究,我学到了一些东西。这是正确的答案。只有当事件处理程序未被删除,并且绑定元素以无法再次访问的方式从DOM中删除时,才会发生内存泄漏。但请注意,这只会影响通过jquery以外的方法或jquery的.detatch
方法从DOM中删除的元素(因为所有其他jquery dom manip方法在删除之前都会正确地清理事件和数据)。另一个例外可能是将元素从dom移动到从未被删除的dom片段。