javascript删除事件侦听器

javascript删除事件侦听器,javascript,event-listener,Javascript,Event Listener,以下内容是否在销毁元素之前删除事件?我无法在DOM检查器中确定附加了哪些函数,以及在运行以下代码后是否删除了这些函数: el.addEventListener('click', function attachFunction (a, b) { console.log(a); console.log(b); }, false); el.removeEventListener('click', attachFunction, false); 如果希望能够删除使用addEventL

以下内容是否在销毁元素之前删除事件?我无法在DOM检查器中确定附加了哪些函数,以及在运行以下代码后是否删除了这些函数:

el.addEventListener('click', function attachFunction (a, b) {
    console.log(a);
    console.log(b);
}, false);

el.removeEventListener('click', attachFunction, false);

如果希望能够删除使用
addEventListener
添加的事件侦听器,请在
addEventListener()调用的外部定义它:

function attachFunction (a, b) {
    console.log(a);
    console.log(b);
}
然后:


然后你的
.removeEventListener()
就可以工作了。

语法
函数foo(无论什么)
是在运行时之前评估的,所以我认为你的代码不是有效的语法,也不会有预期的行为。您最好使用以下匿名函数:

var attachFunction = function(a, b) {
    console.log(a);
    console.log(b);
}
el.addEventListener('click', attachFunction, false);
el.removeEventListener('click', attachFunction, false);

还请注意,事件侦听器(此处为
attachFunction
)只能有一个作为事件对象的参数。

不,目前为止,您的代码无法工作

注意:要删除事件处理程序,使用addEventListener()方法指定的函数必须是外部函数

-(抱歉,但有时W3傻瓜确实提供了您想要的东西)

因此,您需要这样做:

function attachFunction(a, b){
  console.log(a);
  console.log(b);
}

el.addEventListener('click', attachFunction, false);

el.removeEventListener('click', attachFunction, false);
这将按预期工作

如果要将某些参数传递给函数
attachFunction
,则需要使用另一个函数:

function attachFunction(a, b){
  console.log(a);
  console.log(b);
}

function linkFunction(){
  attachFunction(a, b); // a and b can be replaced with anything you want
}

el.addEventListener('click', linkFunction, false);

el.removeEventListener('click', linkFunction, false);

函数
关键字有两种使用方式:a或an。有一个关于差异的讨论,但我将尝试涵盖相关部分

当用作语句(如下所示)时,函数名将在语句的周围范围内有效:

function hi(){ 
    console.log(typeof hi); // "function"
}
console.log(typeof hi); // "function"
但当用作表达式时,函数名仅在函数体中有效:

var greetings = function hi(){ 
    console.log(typeof hi); // "function"
}
console.log(typeof hi); // "undefined"
console.log(typeof greetings); // "undefined
因此,初始示例的范围问题是,由于您将其用作表达式,因此在尝试解除绑定时,名称
attachFunction
将未定义


(我认为您对如何将参数传递给事件处理程序也有一些困惑,但这是一个单独的问题。)

它不会删除事件处理程序,它可能会产生一个错误,因为在您试图删除它的作用域中未定义
attachFunction
。但是参数如何?如何在addEventListener中发送参数?抱歉,不理解;他们呢?如果您告诉我它们应该设置为什么,我可以修复它,但目前我的参数与您的参数相同。我的意思是:el.addEventListener('click',attachFunction(a,b),false)@LorenShqipognja是的,没错。不过,要注意你的术语,应该是:“函数的arguments数组中的第一项始终是事件对象。”“在运行时之前计算”——我很确定这不是真的。它是有效的;这样的函数实例化表达式可以有名称,尽管语义不同于函数声明语句。
var greetings = function hi(){ 
    console.log(typeof hi); // "function"
}
console.log(typeof hi); // "undefined"
console.log(typeof greetings); // "undefined