如何在Greasemonkey脚本中模拟按键?

时间:2012-11-28 06:12:13

标签: javascript greasemonkey keypress

我在网上找到了很多关于如何使用initEventdispatchEvent functions的信息,但我不能让我的生活让他们在实践中工作。

我试图让脚本每隔5秒按 Enter 键。我的用户代码(减去无关的元数据)如下:

// ==UserScript==
// @namespace      http://userscripts.org/scripts/show/153134
// @require        https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js
//
// @grant          unsafeWindow
//
// ==/UserScript==

$(function(){
window.setInterval(function(){
    var ev = document.createEvent("KeyboardEvent");
    ev.initKeyEvent("keypress", true, false, window, 0, 0, 0, 0, 13, 13);
        window.dispatchEvent(evt);
}, 5000);
});

在usercript上查看我的脚本以查看它的工作情况(添加用户包含域并在任何<textarea>上测试)。 Greasemonkey是不是让它通过,还是我需要做一些不同的事情?

2 个答案:

答案 0 :(得分:4)

该代码中存在复制粘贴错误 不要使用window.dispatchEvent(evt);;
使用window.dispatchEvent(ev);

将活动发送到window可能也不是您所需要的。 (或者它可能是。链接到目标页面。)

也许将事件发送到文档:

document.body.dispatchEvent(ev);

或将其发送到特定节点:

var targetNode  = document.querySelector ("#content textarea"); // Etc.
targetNode.dispatchEvent (ev);


或者,因为您使用的是jQuery:

var ev = $.Event('keypress');
ev.which = 13; // Carriage-return (Enter)
$('body').trigger(ev);

答案 1 :(得分:2)

我能够向文档发送击键并让它们正确冒泡的唯一方法是在GM脚本中创建一个额外的脚本插入。此示例使用jQuery模拟击键事件,它检测按下键“x”的时间并将“输入”发送到文档。

var script = document.createElement("script");
script.setAttribute("type", "application/javascript");

script.textContent = "(" + function(){
    $(document).keypress(function(e) {
        if(e.which == 120) {
            var p = jQuery.Event('keydown');
            p.which = 13;
            p.keyCode = 13;
            $('body').trigger(p);
        }
    });
} + ")()";

document.body.appendChild(script);
document.body.removeChild(script);

(编辑:固定等于/等效错误)