2010-09-02 69 views
4

我正在研究一个不依赖于jQuery的Javascript库,尽管我的测试中有jQuery和QUnit。在图书馆里,我附上一个事件到一个元素的jQuery的方式做:如何从QUnit测试中触发本地JavaScript事件?

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

我想在我的QUnit的测试呼叫$('#tab').click();,但它不会导致调用我的事件处理程序。

回答

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。你可以找到一个例子here。不出所料,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); 
+0

这是...令人发指的,但我当然不是一个责备使者:) – 2010-09-02 23:01:14

1

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

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

是本机相当,但你可能想先检查,如果查询的元素实际上发现的元素。当dom准备好时,您是否正在初始化QUnit测试?

另外,对于attachEvent(IE),您需要使用'on'作为前缀事件。

tab.attachEvent('onclick', listenerFn); 

ps。实际上我认为IE浏览器的缺失前缀“on”是问题所在。改变它并再次测试$()。click()。

+0

我在Chrome中运行的测试,所以我怀疑IE特定版本是问题。 – 2010-09-02 22:53:58