【问题标题】:Simulate a Keystroke in Firefox addon在 Firefox 插件中模拟击键
【发布时间】:2012-05-10 01:15:14
【问题描述】:

我希望能够从我的 Firefox 插件中模拟击键,但目前我无法做到。

我发现这个帖子Why simulation of Left Arrow + Shift keys doesnt work in Firefox? 和我的代码几乎一样,但它只做焦点部分,而不是dispatchEvent。知道为什么会发生这种情况吗?

代码如下:

objTag.focus();
var e = document.createEvent('KeyboardEvent');
e.initKeyEvent('keydown', true, true, window, false, false, false, false, 35, 0);
objTag.dispatchEvent(e);

【问题讨论】:

  • 您正确地向某个元素发送了keydown 事件(结束键)。也许您应该解释一下您期望看到的效果?此外,如果objTag 确实是一个对象(意思是 Flash 或类似的东西) - 插件有自己独立于浏览器的事件处理,它们将不会接收浏览器生成的事件。
  • 我的插件将在文本区域的末尾添加一些额外的文本。我想模拟 END 键,然后是 SPACE 键。 objtag 是 textarea 元素。它正在做焦点,但它没有走到行尾。

标签: javascript firefox firefox-addon dom-events


【解决方案1】:

您的代码是正确的,但 <textarea> 元素会响应 keypress 事件,而不是 keydown

不管怎样,为什么这么复杂?您可以只设置input.value,然后使用input.setSelectionRange() method 适当地移动光标。如果你想在当前行的末尾添加一些东西,你可以这样做:

var position = objTag.selectionStart;
var lineEnd = objTag.value.indexOf("\n", position);
if (lineEnd < 0) // No more line breaks
  lineEnd = objTag.value.length;

var textToAdd = "foo";
objTag.value = objTag.value.substr(0, lineEnd) + textToAdd + objTag.value.substr(lineEnd);
objTag.setSelectionRange(lineEnd + textToAdd.length, lineEnd + textToAdd.length);
objTag.focus();

添加到文本末尾更简单:

var textToAdd = "foo";
objTag.value += textToAdd;
objTag.setSelectionRange(objTag.value.length, objTag.value.length);
objTag.focus();

【讨论】:

  • 嗨。感谢您的回复。我试过这个,但它并没有完全符合我的要求。也许我可以更好地解释自己。我将用更多信息更新问题
  • 实际上,'keypress' 部分在击键时效果很好,但它仍然不能解决我的所有问题,因为它没有我按下同一个键时得到的确切效果在键盘上。该站点有一个输入元素,当我按空格、退格、结束等时触发自动完成列表,但我无法使用此解决方案复制该行为。
  • @fsilva:那么您可能想为每个键发送keydownkeypresskeyup - 这是正确模拟用户输入的方法。
  • 做到了!谢谢@Wladimir :)。 tab 键不能以同样的方式工作是否有原因?也许自动建议的内容需要更多时间来加载,我在它完全加载之前触发它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多