2015-04-03 134 views
3

在銷燬元素之前,下面是否實際刪除事件?我不能在DOM檢查找出功能連接什麼,如果他們運行下面的代碼後取出:javascript消除事件監聽器

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

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

它不會刪除事件處理程序,它可能會產生一個錯誤的'attachFunction'是未在您嘗試刪除它的範圍中定義。 – adeneo 2015-04-03 14:10:04

回答

2

沒有,因爲它的立場,你的代碼將無法正常工作

注:要刪除事件處理程序,與addEventListener()方法中指定的函數必須是外部函數。

W3Schoolsw3fools - (不好意思,但有時w3fools並提供你想要的只是什麼)

所以,你需要做這個:

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); 
+0

但是參數怎麼樣? – poashoas 2015-04-03 14:20:03

+0

@poashoas他們呢?它們與您的版本相同... – starwed 2015-04-03 14:22:44

+0

如何發送addEventListener中的參數? – poashoas 2015-04-03 14:23:24

1

如果您希望能夠刪除與addEventListener添加事件偵聽器,把它定義外部addEventListener()電話:

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

則:

el.addEventListener("click", attachFunction); 

然後你.removeEventListener()可以工作。

0

在運行時之前對語法function foo(whatever)進行求值,所以我不認爲你的代碼是一個有效的語法,或者會有預期的行爲。你應該更好地利用匿名函數是這樣的:

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

也請注意,一個事件偵聽器(這裏attachFunction)只能有一個參數是事件對象。

+0

「在運行時間之前評估過」 - 我很肯定這不是事實。 – starwed 2015-04-03 14:28:36

+0

它是有效的;函數實例化表達式可以具有名稱,但語義與函數聲明語句的語義不同。 – Pointy 2015-04-03 14:32:19

0

function關鍵字可以使用兩種方法:作爲function statementexpression。有一個討論here的差異,但我會盡力涵蓋相關部分。

當用作語句中使用(如下),功能名稱將是語句的周邊範圍內有效:

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會當您嘗試解除綁定是不確定的。

(我想你也有關於參數是如何傳遞給事件處理有些混亂,但這是另外一個問題。)