document.createEvent如何处理关键事件?

时间:2010-10-15 11:00:51

标签: dom javascript-events automated-tests keyevent dom-events

我正在尝试模拟Web应用程序中的按键,它适用于嵌入式系统,但它使用Webkit派生的浏览器。我在Chrome中测试了代码并得到了相同的错误。

我尝试使用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(“Events”),它总是归结为同一个异常。嵌入式系统和Chrome中都有。

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:2)

Keypress是UIEvent。您应该使用initUIEvent( 'type', bubbles, cancelable, windowObject, detail )而不是initEvent()。但是对于实现keyEvents的firefox,您应该创建KeyEventsinitKeyEvents()

答案 2 :(得分: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);
}

要向事件对象添加更多数据,CustomEvent接口存在,detail属性可用于传递自定义数据。 例如,可以按如下方式创建事件:

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

参考:Creating and Triggering Events