Как получить текущий элемент в getElementsByClassName

Рассмотрим простое JS-событие

document.getElementsByClassName('test')[0].onclick=function(){
document.getElementsByClassName('test')[0].innerHTML = 'New Text';
}

Как я могу расширить этот код, чтобы в целом работать для всех элементов с class="test". Я хочу, чтобы элемент щелкнул и заменил его содержимое. Фактически нам нужно получить номер node (предоставленный внутри скобки) из события click.

Я пытаюсь лучше понять javascript в ненавязчивых кодах, а не практический метод, например jQuery.

Ответ 1

Просто перебирайте их:

var elements = document.getElementsByClassName('test');

for (var i = 0; i < elements.length; i++) {
    elements[i].addEventListener('click', (function(i) {
        return function() {
            this.innerHTML = 'New Text';
        };
    })(i), false);
}​

Я использовал (function(i) { return function() { ... }; })(i) вместо просто function() { ... }, потому что если вы используете i в обратном вызове, значение i будет elements.length - 1 к моменту его вызова. Чтобы исправить это, вы должны затенять i и по существу передать его значение.

Ответ 2

Просто используйте this внутри функции. this будет элементом, на котором выполняется событие.

(function() {
    var elms = document.getElementsByClassName("test"),
        l = elms.length, i;
    for( i=0; i<l; i++) {
        (function(i) {
            elms[i].onclick = function() {
                this.innerHTML = "New Text";
            };
        })(i);
    }
})();

Это немного сложнее, чем jQuery:

$(".test").click(function() {
    $(this).html("New Text");
});

Но это будет значительно быстрее без раздувания, которое добавляет jQuery;)

Ответ 3

var all = document.getElementsByClassName('test');
for(var i=0;i<all.length;i++)
    all[i].onclick=function(){
        this.innerHTML = 'New Text';
    }

Но это наиболее рекомендуется использовать addEventListener (или attachEvent, в IE/некоторых версиях Opera, я думаю):

var all = document.getElementsByClassName('test');
for(var i=0;i<all.length;i++)
    all[i].addEventListener('click',function(){//If you're gonna use attachEvent, use 'onclick' instead of 'click'
        this.innerHTML = 'New Text';
    }});