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片段。