为什么可以't我生成一个'单击'事件

Why can't I generate a 'click' event directly from my user script?

本文关键字:一个 事件 单击 为什么      更新时间:2024-03-02

我正在制作一个与网页交互的脚本。因此,我需要生成点击事件。(我用的是GreaseMonkey)

我的问题是:

为什么这不能从用户脚本中工作:

$(document).ready(function(){
    $("a:contains('example')").click();
});
  • jQuery进行了检查和测试。工作良好
  • 它在控制台上工作!但不是来自剧本
  • 其他一切都有效
  • 目标有href="JavaScript:void(0)"。这可能是问题所在吗

jQuery .click()与jQuery .trigger()一样,只能可靠地处理jQuery处理的事件。在用户脚本和Greasemonkey脚本的情况下,触发点击的jQuery实例必须与设置事件处理程序的jQuery(通常)是同一个实例。

此外,除非您明确采取对策,否则userscript jQuery会干扰目标页面。

在这种情况下有两种基本方法。(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);
    }
}

请注意,Greasemonkey脚本中不需要$(document).ready(),除非设置了@run-at document-start

由于javascript:void(0),您的脚本什么都不做。click事件被触发,但之后没有任何操作。

如果您将其更改为

<body>
  <a href="style.css">example</a>
  <script>
  $("a:contains('example')").click();
  </script>
</body>

例如,您将打开文件style.css