2

我正在考虑制作自己的 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 和壁虎:1.9.2.15

4

1 回答 1

0

您必须先聚焦该元素,然后才能向它分派关键事件。

编辑:

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

编辑:

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

编辑:

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

于 2011-03-12T00:31:49.567 回答