Я работаю над библиотекой Javascript, которая не зависит от jQuery, хотя в моих тестах доступны jQuery и QUnit. В библиотеке я прикрепляю событие к элементу, как это делает jQuery:

if (document.addEventListener) {
  tab.addEventListener('click', MyModule.show, false);
} else if (document.attachEvent) {
  tab.attachEvent('click', MyModule.show);
}

Я попытался вызвать $('#tab').click(); в моем тесте QUnit, но это не привело к вызову моего обработчика событий.

4
James A. Rosen 3 Сен 2010 в 01:30

2 ответа

Лучший ответ

JQuery имеет свою собственную систему регистрации событий, которая отличается от регистрации событий DOM. Когда мы вызываем $(something).click(), все зарегистрированные обработчики jQuery и зарегистрированный обработчик onclick срабатывают, но больше ничего. Например,

document.body.addEventListener('click', function() { alert('event') }, false);
document.body.onclick = function() { alert('onclick'); };      

$('body').click(); // alerts "onclick"

Если вы вызовете document.body.onclick(), то только второе событие сработает и предупредит "onclick". Чтобы запустить оба события, создайте объект события и отправьте его для рассматриваемого элемента - в данном случае body. Вы можете найти пример здесь. Неудивительно, что IE использует другой механизм, чтобы сделать то же самое, и вам нужно вызвать fireEvent.

Вот пример не кроссбраузерности для современных браузеров (взят из статьи MDC выше),

var clickEvent = document.createEvent('MouseEvents');
clickEvent.initMouseEvent('click', true, true, window,
    0, 0, 0, 0, 0, false, false, false, false, 0, null);

document.body.dispatchEvent(clickEvent);
12
Anurag 2 Сен 2010 в 22:18

(не уверен) jQuery использует собственную систему событий поверх собственной системы событий. $(el).click() вызывается непосредственно в этой системе событий, а не в собственной системе. (/не уверен)

document.getElementById('tab').onclick();

Является собственным эквивалентом, но вы можете сначала проверить, действительно ли при запросе элемента находит элемент. Вы инициализируете тесты QUnit, когда дом будет готов?

Кроме того, для attachEvent (IE) вам необходимо добавить к событиям префикс «on».

tab.attachEvent('onclick', listenerFn);

Пс. на самом деле я думаю, что проблема заключалась в отсутствии префикса «on» для эквивалента IE. Измените его и снова проверьте $ (). Click ().

1
BGerrissen 2 Сен 2010 в 22:07