在Firefox插件中模拟按键

5
我希望能从我的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事件(End键)。也许你应该解释一下你期望看到的效果?另外,如果objTag确实是一个对象(意味着Flash或类似的东西)-插件有自己独立于浏览器的事件处理,它们不会接收由浏览器生成的事件。 - Wladimir Palant
我的插件将在文本区域的末尾添加一些额外的文本。我想模拟按下“End”键,然后是一个空格键。objtag是文本区域元素。它正在进行焦点处理,但是它没有到达行末。 - Filipe Silva
1个回答

2
您的代码是正确的,但是<textarea>元素对keypress事件做出反应,而不是keydown事件。

不管怎样,为什么要这么复杂呢?您可以直接设置input.value,然后使用input.setSelectionRange()方法来适当地移动光标。如果您想在当前行末尾添加一些内容,可以像这样操作:

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();

嗨。谢谢你的回复。我尝试了这个方法,但它并没有完全达到我的预期。也许我应该更好地解释一下自己。我将在问题中更新一些更多的信息。 - Filipe Silva
实际上,“keypress”部分在执行按键操作方面表现良好,但它仍然不能解决我所有的问题,因为它没有在我按下键盘上相同按键时产生的确切效果。该网站有一个输入元素,当我按下空格、退格、结束等键时触发自动完成列表,但我无法使用这个解决方案复制该行为。 - Filipe Silva
@fsilva:那么您可能希望为每个键发送“keydown”、“keypress”和“keyup”-这是正确模拟用户输入的方法。 - Wladimir Palant
搞定了!谢谢@Wladimir :)。Tab键不能以同样的方式工作,有什么原因吗?也许是自动建议的内容需要更多时间来加载,我在它完全加载之前就触发了它。 - Filipe Silva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接