我正在考虑创建自己的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
答案 0 :(得分:0)
您必须先关注元素,然后才能将关键事件发送给它。
编辑:
这仅适用于网页。扩展程序可以将按键事件发送到任何文本字段。
编辑:
文本输入是通过按键事件完成的,而不是keydown事件。
编辑:
如果您不提供字符代码,则不会插入任何字符。 (很抱歉忽略它,它应该是显而易见的。)此外,虽然它似乎适用于您的窗口,但您应该将浏览器的contentWindow作为defaultView传递。