我在网上找到了很多关于如何使用initEvent
和dispatchEvent
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是不是让它通过,还是我需要做一些不同的事情?
答案 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);
(编辑:固定等于/等效错误)