2013-11-28 5 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. onclick является свойство HTMLElementNode объектов. getElementsByTagName возвращает NodeList. Присвоение свойства NodeList не присваивает его каждому члену этого списка.
  2. Точно так же, за исключением случаев, когда вы имеете дело с Array вместо 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 массива, так что даже если вы петельные через что вы не получите ожидание событий при нажатии.

Смежные вопросы