javascript - 为什么我不能直接从我的用户脚本生成 'click' 事件?

标签 javascript jquery greasemonkey

我正在制作一个与网页交互的脚本。所以,我需要生成点击事件。 (我正在使用 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/

相关文章:

javascript - Chrome : Javascript-Window. showModal 对话框不支持?

javascript - 无法读取未定义的属性 '#<Object>',在检索 onClick Custom React 之后

javascript - 让 Jquery 在不刷新的情况下多次滑动 div

jquery - Greasemonkey脚本,从其他页面脚本调用函数

javascript - 从 Greasemonkey 调用时,jQuery UI 对话框会抛出错误

javascript - 为什么 onblur 不起作用?

javascript - jquery 表单提交已取消

element.style 的 jQuery 高度

javascript - 无法通过复选框从输入类型中的 javascript 获取值

JavaScript 链接读取