使用 greasemonkey 或 tampermonkey 触发键盘事件

Trigger keyboard event with greasemonkey or tampermonkey

我创建了一个用户脚本,用于定期从 Google Chrome 中删除历史记录。我能想到的最简单的方法是安装 Clear Cache https://chrome.google.com/webstore/detail/clear-cache/cppjkneekbjaeellbfkmgnhonkkjfpdn?hl=en,它可以让你配置一个键盘快捷键来删除历史记录。我设置的快捷方式是alt+9

这是我打开所需网页时用来触发 alt+9 事件的代码。

var event = document.createEvent('Event'); 
event.initEvent('keydown', true, true); 
event.keyCode = 18&&57;
document.body.dispatchEvent(event);

当我访问目标网站时,历史记录没有被清除,我不确定为什么。我派发的事件和按alt+9不一样吗?手动按下 alt+9 后,快捷方式确实有效。

编辑:也尝试过

// @require      http://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js
// @grant        GM_info

    var press = jQuery.Event("keypress");
press.altKey = true;
press.which = 57;
$("whatever").trigger(press);

function GM_main ($) {
    //alert ('jQuery is installed with no conflicts! The version is: ' + $.fn.jquery);
}

if (typeof jQuery === "function") {
    console.log ("Running with local copy of jQuery!");
    GM_main (jQuery);  
}
else {
    console.log ("fetching jQuery from some 3rd-party server.");
    add_jQuery (GM_main, "2.2.2");
}

function add_jQuery (callbackFn, jqVersion) {
    var jqVersion   = jqVersion || "2.2.2";
    var D           = document;
    var targ        = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    var scriptNode  = D.createElement ('script');
    scriptNode.src  = 'http://ajax.googleapis.com/ajax/libs/jquery/'
                    + jqVersion
                    + '/jquery.min.js'
                    ;
    scriptNode.addEventListener ("load", function () {
        var scriptNode          = D.createElement ("script");
        scriptNode.textContent  =
            'var gm_jQuery  = jQuery.noConflict (true);\n'
            + '(' + callbackFn.toString () + ')(gm_jQuery);'
        ;
        targ.appendChild (scriptNode);
    }, false);
    targ.appendChild (scriptNode);
}

event.keyCode = 18&&57; 有效。这是一个 logical/boolean 操作,结果实际上是 57,因为 18 的计算结果为真,因此分配了第二个操作数。

二元运算 18&57 也不会表示 alt+9。要在按住 alt 键的同时模拟 keydown 9,您必须给出 57 的 keycode 并将 alt-indicator 设置为 true。

var event = new KeyboardEvent();
event.keyCode = 57;
event.which   = 57;
event.altKey  = true;
event.ctrlKey = false;
event.shiftKey= false;
event.target  = window;
window.dispatchEvent(event);

这样做你可以操纵网络应用程序,但是,你不能不能访问浏览器功能,因为这可以由任何网站完成,这意味着很高的安全风险。

用户脚本并不比网站更有特权。您可以开发一个插件来全面访问浏览器 gui。有 templates/boilerplates 用于开发插件。它只是 JavaScript 压缩到一个 .xpi 文件。