2010-10-15 70 views
4

我試圖模擬Web應用程序中的按鍵,它是用於嵌入式系統,但它使用Webkit派生的瀏覽器。我在Chrome中測試了代碼並得到相同的錯誤。document.createEvent應該如何處理關鍵事件?

我嘗試使用Yahoo這個例子中的代碼片段,但在使用dispatchEvent觸發事件時,我不斷收到相同的錯誤。 「target」是DOM樹中的HTML元素。

function fireEvent(target) { 
    var evt = document.createEvent("UIEvent"); 
    evt.initEvent("keypress", true, true); 
    target.dispatchEvent(evt); 
} 

它總是拋出「錯誤:UNSPECIFIED_EVENT_TYPE_ERR:DOM事件異常0」時,我已經試過createEvent(「活動」),以及和它總是歸結到同一個例外。無論是在嵌入式系統還是在Chrome中。

+1

是爲'dispatchEvent'缺少'evt'參數調用? – Phrogz 2011-01-10 17:01:05

+0

UIEvents,而不是UIEvent。 – Ashe 2012-04-05 04:52:17

回答

3

好的,當進行進一步測試時,似乎當所有關鍵事件參數都被正確初始化時,dispatchEvent工作而不會引發異常。

以下代碼有效。

function fireEvent(target) { 
    var evt = document.createEvent("Events"); 
    evt.initEvent("keypress", true, true); 

    evt.view = window; 
    evt.altKey = false; 
    evt.ctrlKey = false; 
    evt.shiftKey = false; 
    evt.metaKey = false; 
    evt.keyCode = 0; 
    evt.charCode = 'a'; 

    target.dispatchEvent(evt); 
} 
2

按鍵是一個UIEvent。您應該使用initUIEvent('type', bubbles, cancelable, windowObject, detail)而不是initEvent()。但對於實現了keyEvents的firefox,您應該創建一個KeyEventsinitKeyEvents()

0

這是舊的線程,只是爲了更新它我添加了另一個答案,以便它對任何人都更有意義。

initEvent()已棄用它在某些瀏覽器中仍受支持,但請避免使用它。

還有就是要創建這樣

function fireEvent(target) { 
    var event = new Event('build'); 

    // Listen for the event. 
    target.addEventListener('build', function (e) { ... }, false); 

    // Dispatch the event. 
    target.dispatchEvent(event); 
} 

事件要更多的數據添加到事件對象更簡潔的方式,自定義事件存在界面和細節屬性可以用來傳遞自定義數據。 例如,事件可以通過以下方式產生:

var event = new CustomEvent('build', { 'detail': target.dataset.time }); 

參考:Creating and Triggering Events