3

我在网上找到了很多关于如何使用initEventdispatchEvent函数的信息,但我一辈子都无法让它们在实践中发挥作用。

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

// ==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);
});

在 userscript 上检查我的脚本,看看它的效果如何(添加一个用户包括域并在 any 上测试它<textarea>)。Greasemonkey 只是不让它通过,还是我需要做一些不同的事情?

4

2 回答 2

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);
于 2012-11-28T06:21:50.333 回答
3

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

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

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

于 2012-12-08T09:36:45.643 回答