如何用给定char /键代码在Chrome扩展初始化键盘事件?(How to to initiali

2019-07-17 11:50发布

我正在开发一个谷歌浏览器扩展,它模拟了一个网页上的键盘事件。

我发现, event.initKeyboardEvent()不会因为正常此WebKit的错误 ,我也发现了一些解决方法,如SO问题

然而,事件对象定义属性不能正常工作,因为扩展的内容脚本有自己的“平行世界”这样的内容脚本定义的属性并不网页脚本可见。

我唯一和最后的希望,DOM 4事件中的构造谷歌浏览器工作,并有可能通过构造函数正确初始化键盘事件

var event = new KeyboardEvent("keypress", {key: 'U+0041', char: 'a', ... })

不幸的是,它失败:

TypeError: illegal constructor  

我没能找到在Chrome支持的事件构造的任何文件。 任何人都可以点我的一些文档/源代码?

任何其他方式来模拟在谷歌Chrome扩展键盘事件?

(注意,TextEvent,并将不会帮助,因为许多现实世界的控制听keydown / keyup专)

Answer 1:

因为当你开始从页面(反之亦然)一个内容脚本事件浏览器不保存自定义属性,在页面中注入一个脚本来接手这项工作。 下面是其中给出了这个概念的基本示例。 它是可用的,虽然keykeyCode属性不正确处理(那些不应该无论如何使用)。

// Example: Say, you've got a reference to a DOM element...    
var elem = document.body;
// And you want to "type" "A"
var charCode = 65;

// Now, you want to generate a key event...
triggerKeyEvent(elem, charCode);

// triggerKeyEvent is implemented as follows:
function triggerKeyEvent(element, charCode) {
    // We cannot pass object references, so generate an unique selector
    var attribute = 'robw_' + Date.now();
    element.setAttribute(attribute, '');
    var selector = element.tagName + '[' + attribute + ']';

    var s = document.createElement('script');
    s.textContent = '(' + function(charCode, attribute, selector) {
        // Get reference to element...
        var element = document.querySelector(selector);
        element.removeAttribute(attribute);

        // Create KeyboardEvent instance
        var event = document.createEvent('KeyboardEvents');
        event.initKeyboardEvent(
            /* type         */ 'keypress',
            /* bubbles      */ true,
            /* cancelable   */ false,
            /* view         */ window,
            /* keyIdentifier*/ '',
            /* keyLocation  */ 0,
            /* ctrlKey      */ false,
            /* altKey       */ false,
            /* shiftKey     */ false,
            /* metaKey      */ false,
            /* altGraphKey  */ false
        );
        // Define custom values
        // This part requires the script to be run in the page's context
        var getterCode = {get: function() {return charCode}};
        var getterChar = {get: function() {return String.fromCharCode(charCode)}};
        Object.defineProperties(event, {
            charCode: getterCode,
            which: getterCode,
            keyCode: getterCode, // Not fully correct
            key: getterChar,     // Not fully correct
            char: getterChar
        });

        element.dispatchEvent(event);
    } + ')(' + charCode + ', "' + attribute + '", "' + selector + '")';
    (document.head||document.documentElement).appendChild(s);
    s.parentNode.removeChild(s);
    // The script should have removed the attribute already.
    // Remove the attribute in case the script fails to run.
    s.removeAttribute(attribute);
}

这是一个简单的例子,其触发keypress事件对于char“A”。 如果要触发更多相关的重要事件,不使用triggerKeyEvent三次(因为它有一个轻微的开销)。 相反,修改triggerKeyEvent功能,使得它触发的所有事件( keydownkeypresskeyup和/或input用正确的参数)。

如果您需要能够改变altKeyshiftKey等等,只需修改功能。
底线:我展示的例子是非常基本的,可以调整,以满足您的需求。

阅读更多

如果你想改变实现符合规格,阅读这些来源:

  • W3C: DOM Level 3的活动规范,部分键盘事件类型
  • W3C: DOM第3级事件规范,附录B:传统密钥属性:键代码,则charCode,并且其

如果您想了解更多关于脚本注入的内容脚本的概念,请参阅:

  • 堆栈溢出: -使用内容脚本在页面注入代码构建一个Chrome扩展


Answer 2:

柜面任何人有我面临触发KEYUP与特定的键码的问题。 这是一种方式。

首先我想上面没有运气@RobW的答案。 无键码过去了,总是不确定的。

于是我看着@ disya2的回答,这没有工作。

因此,这里的一些代码: -

表现

"permissions": [
    "debugger"
  ],

ContentScript.js

chrome.runtime.sendMessage({ pressEnter: true });

Background.js

chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
    if(message.pressEnter){
        chrome.tabs.query({active: true}, function(tabs) {
            chrome.debugger.attach({ tabId: tabs[0].id }, "1.0");
            chrome.debugger.sendCommand({ tabId: tabs[0].id }, 'Input.dispatchKeyEvent', { type: 'keyUp', windowsVirtualKeyCode:13, nativeVirtualKeyCode : 13, macCharCode: 13  });
            chrome.debugger.sendCommand({ tabId: tabs[0].id }, 'Input.dispatchKeyEvent', { type: 'keyDown', windowsVirtualKeyCode:13, nativeVirtualKeyCode : 13, macCharCode: 13  });
            chrome.debugger.detach({ tabId: tabs[0].id });
        });
    }
});


Answer 3:

我发现,铬调试协议V1.1是肯定的答案,以模拟从谷歌Chrome扩展键和鼠标事件。 该协议的一部分是通过访问chrome.debugger API 。



文章来源: How to to initialize keyboard event with given char/keycode in a Chrome extension?