jQuery .unbind()函数如何在JavaScript中工作?

时间:2014-03-25 06:15:43

标签: javascript jquery

一些背景知识:JavaScript函数.removeEventListener()需要显式声明要删除的处理程序,而jQuery的.unbind()将自动删除与给定元素关联的所有事件侦听器。

看一下jQuery源代码,我很担心.unbind()函数实际上是如何做它正在做的事情。如果它不知道名称,它如何删除与给定元素关联的所有可能的处理程序?

编辑:对不起,如果我不清楚。我的问题是“.unbind()的JavaScript源代码是如何工作的?”我知道如何使用.unbind()。我想知道它为什么有效。

4 个答案:

答案 0 :(得分:1)

如果您看到jquery-1.11.js,就会找到答案

当你拨打jQuery.removeEvent

时,最后会调用

unbind()

jQuery.removeEvent = document.removeEventListener ?
    function( elem, type, handle ) {
        if ( elem.removeEventListener ) {
            elem.removeEventListener( type, handle, false );
        }
    } :
    function( elem, type, handle ) {
        var name = "on" + type;

        if ( elem.detachEvent ) {

            // #8545, #7054, preventing memory leaks for custom events in IE6-8
            // detachEvent needed property on element, by name of that event, to properly expose it to GC
            if ( typeof elem[ name ] === strundefined ) {
                elem[ name ] = null;
            }

            elem.detachEvent( name, handle );
        }
    };

对于egs,请尝试unbind()

$('#selector').unbind('click',handler);

上方有elemtypehandle removeEventListener()function( elem, type, handle )

这里

  1. ELEM = $( '#选择')
  2. 类型=点击
  3. 手柄=处理程序
  4. unbind()的逐步调用,请参阅jquery-1.11.1.js source

    1. $('#selector').unbind('click') // calling unbind function line 8490
    2. 调用off() // line 8491(calling) => line 5201(function definition)
    3. 现在致电event.remove() // line 5229 => line 4374
    4. 最终调用removedata(),其中removeEventListener函数被称为

答案 1 :(得分:0)

$( "#foo" ).unbind();

Unbind with no argument会删除附加到元素的所有处理程序。

var handler = function() {
alert( "The quick brown fox jumps over the lazy dog." );
};
$( "#foo" ).bind( "click", handler );
$( "#foo" ).unbind( "click", handler );

通过指定click事件类型,只有该事件类型的处理程序将是未绑定的

答案 2 :(得分:0)

问题是jquery unbind只删除与jquery绑定绑定的事件处理程序,它缓存由.bind绑定的所有事件处理程序,当你调用.unbind('click')时,它解除绑定所有处理程序。 例: 如果你写

function click(){}
el.bind('click', click);
el[0].addEventListener('click', click);

然后  el.unbind('click') 要么 el.unbind('click', click); 它只会删除.bind绑定的函数, 因此,如果你使用jquery,你应该总是使用.bind来防止不使用处理程序

答案 3 :(得分:0)

还有一个想法 如果你写

String 然后

outerLists.stream()
          .flatMap(ol -> ol.subLists().stream())
          .flatMap(s->s.items.stream()).count();

jquery将使用el[0].addEventListener('click', click); 删除事件侦听器 但如果你只使用

el.unbind('click', click);

jquery不会删除你的监听器