【问题标题】:Trigger native keyboard events from a Chrome extension从 Chrome 扩展程序触发本机键盘事件
【发布时间】:2012-09-09 16:56:05
【问题描述】:

Facebook 有文本区域,它们在其中扩展/缩小到其内部文本的大小。在我的 Chrome 扩展程序中,我将 textarea 中的文本更改为多行。但是,textareas expand/shrink 方法只适用于键盘事件,所以我必须触发一个。

var event = document.createEvent('KeyboardEvent');

event.initEvent('keyup', true, true, window, false, false, false, false, 38, 38);
this.dispatchEvent(event); // this is the textarea

(它对所有的 keyup、keydown、keypress 执行此操作)

但这不起作用。现在,我知道它为什么不起作用,但不知道如何解决它。我已将处理程序附加到元素以查看发生了什么:

$('[role=dialog] .MessagingComposerForm textarea').on('keyup', function(e) {
    console.log(e);
});

当 Chrome 扩展触发它的 keyup 事件时,我在控制台中看到的对象是一个普通的 Event 对象,除了两件事:keyCode=0 和 view=null。

当我通过按键盘上的某个键触发 keyup 事件时,我可以看到 keyCode=38 和 view=Window。

有人知道怎么做吗?

添加:

我发现了一些东西。如果我在调度事件之前对其进行控制台记录,它仍然不包含正确的信息。这里:

var event = document.createEvent('KeyboardEvent');

event.initKeyboardEvent('keydown', true, true, window, false, false, false, false, 65, 65);
event.keyCode = 65;
event.which = 65;
event.charCode = 65;

console.log(event);

this.dispatchEvent(event); // this is the textarea

输出这个对象:

KeyboardEvent: {
    ...
    charCode: 0,
    keyCode: 0,
    view: Window,
    which: 0
}

【问题讨论】:

  • 我已经让它适用于鼠标事件。所以我可以很容易地点击 Facebooks 处理程序捕获的元素。我就是不能让它对键盘事件起作用。
  • 您是否尝试过使用具有相同参数的initKeyboardEvent 而不是initEvent
  • @haynar 奇怪的是,现在视图设置为窗口。但是keyCode仍然是错误的。进行更多调查。
  • 请注意,我的“相关”链接实际上是 Safari 上的 keypress。它可能无法解决您的问题,但可能包含一些有用的信息。

标签: javascript dom javascript-events google-chrome-extension


【解决方案1】:

这是 WebKit 中的一个错误:https://bugs.webkit.org/show_bug.cgi?id=16735

30char

【讨论】:

    最近更新 更多