2013-08-29 94 views
-1

我想遍歷下面的代碼,並且由於某種原因,每次我遍歷它時,它會觸發事件處理程序,是否有人知道它爲什麼會自動觸發處理程序?Javascript迭代問題

nmbr = 1;   
x1 = document.getElementsByClassName('fp')[0] ; 
     slowSkrol = document.createElement('button'); 
     slowSkrol.className = 'mods'; 
     slowSkrol.value= nmbr; 
      x1.appendChild(slowSkrol); 
     slowSkrol.addEventListener('click', whenclicked(nmbr),false); 
function whenclicked(vv){ 
alert(vv); 
} 
+0

請注意[此作品](http://jsfiddle.net/VzgUe/),但[這並不](http://jsfiddle.net/VzgUe/)。 – Paulpro

回答

2

您正在調用函數,並將其返回值綁定到事件,而不是將函數本身綁定到事件。更換whenclicked(nmbr)有:

function(){ whenclicked(nmbr); } 

在現代瀏覽器中,你也可以使用bind

whenclicked.bind(null, nmbr); 
+0

或者(其中綁定可用):'slowSkrol.addEventListener('click',whenclick.bind(slowSkrol,nmbr))''。這確實會對通過事件分配的'this'過度使用,儘管.. – user2246674

+0

@ user2246674因此是一個不好的方法。 – iConnor

1

變化:

slowSkrol.addEventListener('click', whenclicked(nmbr),false); 

slowSkrol.addEventListener('click', function() { 
    whenclicked(nmbr); 
},false); 
1

我不應該是廣告再確定一個答案。但正確的方法來做到這一點,以便你得到所有的參數和this會是這樣。

slowSkrol.addEventListener('click', function(event) { 
    whenclicked.apply(this, [event, nmbr]); 
}, false); 

然後你可以像這樣使用它。

function whenclicked(event, nmbr){ 
    alert(this, event, nmbr); 
    // this = slowSkrol 
}