为什么我的dispatchEvent适用于鼠标事件但不适用于关键事件

时间:2011-03-10 08:57:01

标签: javascript javascript-events firefox-addon firefox3.6

我正在考虑创建自己的Firefox附加组件,并为我可能添加的功能做一些实验。

由于我现在正在检查事物的可行性,我只是从mozilla附加构建器创建了一个骨架并开始使用它。我现在正在尝试的是发送鼠标点击或按键事件。

我已经尝试了发送事件的可用方法,但不知何故,它不适用于关键事件

我使用dispatchEvent

尝试了它
onMenuItemCommand: function(e) {  

    netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');


    var evt1 = document.createEvent("MouseEvents");
    evt1.initMouseEvent("click", true, true, window,
        0, 0, 0, 0, 0, false, false, false, false, 0, null);

    //it's returning me null for document.getElementById... so I changed it.
    var cb1 =  gBrowser.selectedBrowser.contentDocument.getElementById("strict");
    var canceled1 = !cb1.dispatchEvent(evt1);


    var evt = document.createEvent("KeyEvents");
    evt.initKeyEvent("keydown", true, false, window,
                 false, false, false, false, 0x42, 0);
    var cb =  gBrowser.selectedBrowser.contentDocument.getElementById("filter"); 
    var canceled = !cb.dispatchEvent(evt);
    if(canceled) 
    {
        // A handler called preventDefault
        alert("canceled");
    } 
    else 
    {
        // None of the handlers called preventDefault
        alert("not canceled");
    }       
}   

当我在firefox中尝试此代码时,它确实更新了复选框,这意味着点击事件有效。但在文本框中没有发生任何事情,我希望它能打印出一个角色。但它显示警告框“未取消”证明该事件未被取消!

由于事件没有被取消,我决定在window.document上放一个按键处理程序......当附加组件发送这些事件时它被调用了!这意味着事件正在生成并且正在冒泡。

那么为什么只有鼠标事件有效且关键事件不起作用呢?我在这里错过了什么吗?

(我也尝试过使用nsIDOMWindowUtils的sendKeyEvent。仍然没有运气。)

顺便说一句,我使用Firefox 3.6.15和Gecko:1.9.2.15

1 个答案:

答案 0 :(得分:0)

您必须先关注元素,然后才能将关键事件发送给它。

编辑:

这仅适用于网页。扩展程序可以将按键事件发送到任何文本字段。

编辑:

文本输入是通过按键事件完成的,而不是keydown事件。

编辑:

如果您不提供字符代码,则不会插入任何字符。 (很抱歉忽略它,它应该是显而易见的。)此外,虽然它似乎适用于您的窗口,但您应该将浏览器的contentWindow作为defaultView传递。