2015-04-02 4 views
0

Я относительно новым для мира Javascript, одна вещь, которая действительно сбивает с толку меня, и я не совсем уверен, как даже Google это, это ...Понимание различных прослушиватель событий приближается


Как делает это:

document.querySelector('.one').addEventListener('click', function(event){ 
    event.preventDefault(); 
    this.style.textDecoration = 'underline'; 
}, false); 

сравнить с этим:

[].forEach.call(document.querySelectorAll('.two'), function(el){ 
    el.addEventListener('click', function(event){ 
    event.preventDefault(); 
    this.style.textDecoration = 'underline'; 
    }, false); 
}); 

и это ...

var func = function(event){ 
    event.preventDefault(); 
    this.style.textDecoration = 'underline'; 
}; 

document.querySelector('.three').addEventListener('click', func, false); 

от того, что я могу сказать, все они делают одно и то же? Лучше ли от другого? Действительно ли они делают разные вещи? Или это просто больше подходит для разных методов поддержки и масштабируемости?

... есть ли другие методы, которые лучше, чем эти?

FIDDLE

+0

Один работает и два других? если вы просто пропустили код образца –

+0

'[] .forEach (...' означает «Do ??? 0 раз», так как [] представляет пустой массив. EDIT: Кевин прав, извините, я обычно ожидаю увидеть «Array.prototype.forEach», когда ожидается использование без экземпляра. – Katana314

+0

Вы только что полностью изменили всю предпосылку вопроса? – adeneo

ответ

1

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

Этого

[].forEach.call(document.querySelectorAll('.two'), function(el){ 
    el.addEventListener('click', function(event){ .... 

получает все элементы, соответствующие селектор .two и итерацию над ними и добавляет обработчик событий для всех из них.

Это, однако

document.querySelector('.one').addEventListener('click', function(event){ 

получает только первый элемент, соответствующий селектор .one и добавляет обработчик событий к нему, любые другие элементы, которые согласовывают этот класс не получил. Это единственное реальное различие!

+0

Спасибо, и я ценю ваши ответы! Приношу свои извинения за мои быстрые изменения и заставляю вас ответить дважды. – darcher

+0

Нет проблем, это было просто несколько смущает? – adeneo

+0

Я был я был в предположении, что 'document.querySelectorAll ('. one'). addEventListener ('click', function (event) {' был действительно возможен, когда я изначально задал вопрос. Но теперь имеет смысл, почему ' rray.prototype.forEach' требуется в этом экземпляре, поскольку он получает HTMLCollection, а не только один элемент. (Я думаю ... надеюсь, га), началось с jquery ... переход на javascript ... отсюда мое замешательство. – darcher

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