2010-09-02 88 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