通过显式调用.off()来删除jQuery中的.one()事件处理程序是否安全

时间:2014-04-18 19:42:29

标签: javascript jquery

使用.on()方法可以删除使用.off()添加的jQuery中的事件处理程序。每个事件最多执行一次.one()怎么样?是否可以使用.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()的使用

1 个答案:

答案 0 :(得分:3)

  

特别想知道是否会有任何副作用,例如如果显式删除自删除事件处理程序,则内存泄漏

不,不会有。

这是处理此问题的.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获得一个特殊的回调,当被调用时解除绑定事件然后执行原始回调。