我正在编写一个 Firefox 插件,并且需要以编程方式生成键事件,并让浏览器执行所有操作,就像用户输入这些键一样。
我正在尝试使用 DOMWindowUtils ( https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIDOMWindowUtils ) 的 sendKeyEvent。我发现了以下问题:
如果我在 contentEditable 字段中生成左箭头/右箭头之类的事件,则浏览器不会更改光标位置。为什么?(注意:如果我为 'a'、'b'、... 等字符生成事件,那么浏览器会适当地更新 contentEditable 区域内的文本,因此我的代码中没有明显的缺陷)。对于非 contentEditable 字段,它的行为符合预期。
可以在 Tools->Web Developer->Scratchpad 中执行的示例代码,环境为“浏览器”(代码需要 chrome 权限)。
var doc = gBrowser.contentDocument,
win = doc.defaultView;
var domWindowUtils = win.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindowUtils);
var div = doc.getElementById('contentEditableDiv');
div.focus();
['keydown', 'keypress', 'keyup'].forEach(function(type) {
// if I generate characters like 'a', 'b' they work
// domWindowUtils.sendKeyEvent(type, 65, 97, 0, 0);
// 37 is left arrow, 38 right arrow
domWindowUtils.sendKeyEvent(type, 37, 0, 0, 0);
});
我尝试使用initEvent/dispatchEvent
但显示相同的结果。
有没有办法可以可靠地生成事件并让浏览器执行所有操作?