4

我正在开发一个不依赖 jQuery 的 Javascript 库,尽管我的测试中有 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

2 回答 2

12

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);
于 2010-09-02T22:18:20.787 回答
1

(不确定)jQuery 在本地事件系统之上使用它自己的事件系统。$(el).click()直接在该事件系统上调用,而不是在本机系统上调用。(/没有把握)

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

是本机等效项,但您可能需要先检查查询元素是否确实找到了该元素。当 dom 准备好时,您是否正在初始化 QUnit 测试?

此外,对于 attachEvent (IE),您需要在事件前加上“on”。

tab.attachEvent('onclick', listenerFn);

附言。实际上,我认为 IE 等效项缺少前缀“on”是问题所在。更改它并再次测试 $().click() 。

于 2010-09-02T22:07:43.290 回答