如何从QUnit测试触发本机Javascript事件?

如何从QUnit测试触发本机Javascript事件?,javascript,jquery,unit-testing,qunit,Javascript,Jquery,Unit Testing,Qunit,我正在开发一个不依赖jQuery的Javascript库,尽管我的测试中有jQuery和QUnit。在库中,我以jQuery的方式将事件附加到元素: if (document.addEventListener) { tab.addEventListener('click', MyModule.show, false); } else if (document.attachEvent) { tab.attachEvent('click', MyModule.show); } 我尝试调用$

我正在开发一个不依赖jQuery的Javascript库,尽管我的测试中有jQuery和QUnit。在库中,我以jQuery的方式将事件附加到元素:

if (document.addEventListener) {
  tab.addEventListener('click', MyModule.show, false);
} else if (document.attachEvent) {
  tab.attachEvent('click', MyModule.show);
}
我尝试调用
$('#tab')。单击(),但它不会导致调用我的事件处理程序。

(不确定)jQuery在本机事件系统之上使用自己的事件系统<代码>$(el)。click()
直接在该事件系统上调用,而不是在本机系统上调用。(/不确定)

是本机等效项,但您可能希望首先检查查询元素是否确实找到了该元素。当dom就绪时,您是否正在初始化QUnit测试

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

tab.attachEvent('onclick', listenerFn);

事实上,我认为IE中缺少的前缀“on”就是问题所在。更改它并测试$()。再次单击()。

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使用不同的机制来执行相同的操作,您需要调用

下面是一个针对现代浏览器的非跨浏览器示例(摘自上面的MDC文章)


我在Chrome上运行测试,所以我怀疑IE特定版本是问题所在。那就是。。。令人发指,但我当然不能责怪使者:)
document.body.addEventListener('click', function() { alert('event') }, false);
document.body.onclick = function() { alert('onclick'); };      

$('body').click(); // alerts "onclick"
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);