我正在制作一个与网页交互的脚本。所以,我需要生成点击事件。 (我正在使用 GreaseMonkey)
好吧,我的问题是:
为什么这在用户脚本中不起作用:
$(document).ready(function(){
$("a:contains('example')").click();
});
- jQuery 检查和测试。工作正常。
- 它在控制台上运行!但不是来自剧本
- 其他一切正常...
- 目标有一个
href="JavaScript:void(0)"
这可能是问题所在吗?
最佳答案
jQuery .click()
与 jQuery .trigger()
一样,只能可靠地处理由 jQuery 处理的事件。并且在userscripts 和 Greasemonkey 脚本的情况下,触发点击的 jQuery 实例必须与设置事件处理程序的 jQuery 实例相同(通常)。
此外,userscript jQuery interferes with the target page unless you explicitly take countermeasures .
在这种情况下有两种基本方法。 (1) 使用 @grant none
模式,(2) 正确沙盒您的脚本并生成真正的点击事件。
(1) 快速而肮脏的@grant none
方法:
// ==UserScript==
// @name _YOUR_SCRIPT_NAME
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant none
// ==/UserScript==
var $ = window.jQuery;
$("a:contains('example')").click();
警告:使用此方法,您不能使用内置的GM_
函数。而且,页面必须运行 jQuery 才能使用 jQuery 函数。
(2)推荐的点击事件方式:
// ==UserScript==
// @name _YOUR_SCRIPT_NAME
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @grant GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
introduced in GM 1.0. It restores the sandbox.
*/
var targLink = $("a:contains('example')");
clickNode (targLink);
function clickNode (jNode) {
if (jNode && jNode.length) {
var clickEvent = document.createEvent ('MouseEvents');
clickEvent.initEvent ('click', true, true);
jNode[0].dispatchEvent (clickEvent);
}
}
请注意,除非设置了 @run-at document-start
,否则 Greasemonkey 脚本中不需要 $(document).ready()
。
关于javascript - 为什么我不能直接从我的用户脚本生成 'click' 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20362839/