繁体   English   中英

为什么我不能直接从我的用户脚本生成“点击”事件?

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

我正在创建一个与网页交互的脚本。 所以,我需要生成点击事件。 (我正在使用GreaseMonkey)

好吧,我的问题是:

为什么这不适用于用户脚本:

$(document).ready(function(){
    $("a:contains('example')").click();
});
  • jQuery检查并测试。 工作正常。
  • 它从控制台工作! 但不是来自剧本
  • 其他一切都有效......
  • 目标有一个href="JavaScript:void(0)"这可能是问题吗?

jQuery的.click()如jQuery .trigger()只能用jQuery的事件处理工作可靠。 对于userscripts和Greasemonkey脚本,触发click的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);
    }
}

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

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

如果你改成它

<body>
  <a href="style.css">example</a>

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

例如,你将得到文件style.css open。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM