Greasemonkey脚本。如何自动单击其间具有未知空白量的链接

时间:2014-07-05 16:59:30

标签: javascript hyperlink greasemonkey

我想要一个可以自动点击具有特定单词的链接的greasemonkey脚本。在这种情况下,我希望脚本单击显示"单击此处接受的链接!"我找到了一个有效的脚本,但是,我想要使用它的网站有一个异常的链接。它在单词' Here'之间有不明数量的空格。和单词' To'

<a
    href="accept.php?eSessID=7773160788107402312135408908242639440395021097128232706420140705121030&eSignupID=413&eEventID=102&sunow=1&ceRef=MOBILE"><b><u>Click Here
    To Accept!</u></b></a>

我发现这个脚本似乎适用于具有普通链接的网站。但是,我怀疑脚本不能在上面的链接上工作,因为空白量不明。

// ==UserScript==
// @name Auto Click
// @version 1.0
// @author Joe
// @include  http://website.com/*
// @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.
*/

//--- Note that the contains() text is case-sensitive.
var TargetLink = $("a:contains('Click Here To Accept!')")

if (TargetLink.length)
    window.location.href = TargetLink[0].href

我是编程的新手,对Javascripts的知识非常有限。请帮我找一个解决方案。任何帮助将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:2)

在Scriptish中,您可以使用简化的XPath函数:

GM_xpath("//*[normalize-space()='Click Here To Accept!']//ancestor::a").click();

如果要获取所有次出现的列表,请使用:

var myLinks = GM_xpath({path:"//*[normalize-space()='Click Here To Accept!']//ancestor::a", all:true});

并迭代返回的链接。请记住元数据标题中的@grant GM_xpath

<强>填充工具
当您的用户脚本引擎的API未提供GM_xpath时,您可以使用document.evaluate()实现它:

if(!this.GM_xpath)
  this.GM_xpath = function(descriptor)
  {
    if(descriptor === null || typeof descriptor === 'undefined')
      throw new TypeError('GM_xpath(): Descriptor must not be null or undefined.');

    var
      result, item, args,
      array = []
    ;

    args = descriptor.constructor.name === 'String'
      ? {path: descriptor, all:false}
      : {path: descriptor.path, all: descriptor.all}
    ;

    result = document.evaluate
    (
      args.path,
      document,
      document.createNSResolver(document),
      args.all ? XPathResult.ORDERED_NODE_ITERATOR_TYPE : XPathResult.FIRST_ORDERED_NODE_TYPE,
      null
    );

    if(!args.all)
      return result.singleNodeValue;

    while(item = result.iterateNext())
      array.push(item);
    return array;
  };

答案 1 :(得分:1)

您可以使用简单的正则表达式过滤链接:

var targetLink = $("a").filter(function() {
    return /click\s+here\s+to\s+accept/i.test($(this).text());
});

或者你可以这样:

var targetLink = $("a:contains('Click'):contains('Here'):contains('To'):contains('Accept')");

但即使单词不按要求的顺序,这也会匹配。我认为正则表达式方法更好。