2013-11-28 40 views
0

初學JS在這裏,希望任何人都可以向我解釋這一點。關於onclick函數的困惑

1)爲什麼這個不行:

var allSpans = document.getElementsByTagName('span'); 
allSpans.onclick = function() { 
alert('hoo'); 
}; 

2),或者如果我把所有的innerHTML從陣列中的跨度和我試試這個:

var allSpans = document.getElementsByTagName('span'); 
var arrayNumbers = []; 

for (var i = 0; i < allSpans.length; i++) { 
    var operator = allSpans[i].innerHTML; 
} 
arrayNumbers.onclick = function() { 
alert('hoo'); 
}; 
+1

getElementsByTagName不返回一個元素,而是一個列表。 –

回答

2
  1. onclickHTMLElementNode物業的財產。 getElementsByTagName返回節點列表。將屬性分配給節點列表不會將其分配給該列表的每個成員。
  2. 完全一樣,除非您正在處理陣列而不是NodeList
1

你必須通過返回的列表

var allSpans = document.getElementsByTagName('span'); 

for (var i = 0; i < allSpans.length; i += 1) { 
    allSpans[i].onclick = function (event) { 
     alert('hoo'); 
    }; 
} 
+0

好的,我明白了,但是在JSlint中出現這樣的錯誤:不要在循環中創建函數。發生?這是要看的東西還是沒有關係? –

+1

@Marek:在你的例子中並不重要,但它是你必須意識到的。請參閱http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example。 –

0

迭代要回答你的第一個問題,你必須添加此的每個節點,而不是節點列表,其上是當你打電話給你在說什麼document.getElementsByTagName。什麼你要找的是:

for(var i = 0; i < allSpans.length; i++){ 
    allSpans[i].onClick = function(){ 
    alert('hoo'); 
    }; 
} 

你的第二個問題,有一個類似的問題,只是它不出現,如果你實際上添加任何的arrayNumbers陣列,所以即使你通過循環你不會在點擊時得到預期的事件。