2013-11-28 41 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阵列,所以即使你通过循环你不会在点击时得到预期的事件。