Я предлагаю (если явно не нужно перебирать в обратном направлении):
var els = document.getElementsByClassName('item'),
l = els.length,
foo = function() { alert("foo"); };
for (var i = 0; i< l; i++) {
els[i].onclick = foo;
}
JS Fiddle demo.
Проблемы с кодом:
// 'Length' should be 'length':
var l = document.getElementsByClassName("item").Length;
var foo = function() { alert("foo"); };
// since you're not changing the class-name there's no need to
// go in reverse (it's just confusing to read):
for (var i = l - 1; i >= 0; i--) {
// you're re-querying every iteration (plus when you're getting the length), why?
// keeping the parentheses assigns the (non-existent) return value of the function,
// instead of binding the function to the 'click' event:
document.getElementsByClassName("item")[i].onclick = foo();
}
Кстати, вы могли бы вместо того, чтобы связать события обработчик до ближайшего предка элемента, который охватывает все элементы, которые вы хотите, чтобы иметь эффект, когда они щелкнули (примечание: используйте ближайший предок, который существует в DOM во время привязки события, в этом случае это body
, потому что нет других элементов упаковки, в большинстве случаев это будет, и самое ближайшее следует использовать, чтобы избежать событий, имеющих до пузырьков до верхнего уровня):
var bindTarget = document.body, // use the closest wrapping element
foo = function (e) {
var e = e || window.event,
clicked = e.target || e.srcElement;
if (clicked.className.indexOf('item') > -1) {
alert("foo");
}
};
bindTarget.onclick = foo;
JS Fiddle demo.
@Mate * «просьба не отвечать на jquery» * –
onclick должен быть foo, вы * вызываете * foo из-за parens. Обычно, задавая вопросы, вы должны указать, что на самом деле происходит, например, предупреждение происходит слишком рано и т. Д. –
(И да, что с обратной итерацией?) –