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

时间:2013-12-03 22:16:08

标签: javascript jquery greasemonkey

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

好吧,我的问题是:

为什么这不起作用于用户脚本:

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

2 个答案:

答案 0 :(得分:3)

jQuery .click(),就像jQuery .trigger()一样,只能与jQuery处理的事件一起可靠地工作。在用户脚本和Greasemonkey脚本的情况下,触发click的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);
    }
}

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

答案 1 :(得分:1)

由于javascript:void(0),您的脚本无效。触发了click事件,但之后没有任何操作。

如果您将其更改为

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

  <script>
  $("a:contains('example')").click();
  </script>
</body>
例如,您将获得文件style.css打开。