一些背景知识:JavaScript函数.removeEventListener()
需要显式声明要删除的处理程序,而jQuery的.unbind()
将自动删除与给定元素关联的所有事件侦听器。
看一下jQuery源代码,我很担心.unbind()
函数实际上是如何做它正在做的事情。如果它不知道名称,它如何删除与给定元素关联的所有可能的处理程序?
编辑:对不起,如果我不清楚。我的问题是“.unbind()的JavaScript源代码是如何工作的?”我知道如何使用.unbind()。我想知道它为什么有效。
答案 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);
上方有elem
,type
和handle
removeEventListener():function( elem, type, handle )
这里
unbind()
的逐步调用,请参阅jquery-1.11.1.js source
$('#selector').unbind('click') // calling unbind function line 8490
// line 8491(calling) => line 5201(function definition)
event.remove()
// line 5229 => line 4374
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不会删除你的监听器