Javascript Greasemonkey脚本。如何自动单击中间空白未知的链接

Javascript Greasemonkey脚本。如何自动单击中间空白未知的链接,javascript,hyperlink,greasemonkey,Javascript,Hyperlink,Greasemonkey,我想要一个greasemonkey脚本,可以自动点击一个有特定单词的链接。在本例中,我希望脚本单击显示“单击此处接受”的链接。我发现一个脚本可以工作,但是,我想使用它的网站有一个异常链接。在单词“Here”和单词“To”之间有未知数量的空格 <a href="accept.php?eSessID=7773160788107402312135408908242639440395021097128232706420140705121030&eSignupID=413&e

我想要一个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>
我是一名编程新手,对Java脚本的了解非常有限。请帮我找到解决办法。任何帮助都将不胜感激

多谢各位


Joe

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

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')");

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

在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

Polyfill
当userscript引擎的API不提供GM_xpath时,可以使用
document.evaluate()


Greasemonkey中没有
GM_xpath
。这是一个脚本式的API。@BrockAdams非常感谢您指出这一点!此外,还有一个错误:第二个表单必须作为一个参数作为对象传递。我已经更正了答案并添加了一个polyfill。
var myLinks = GM_xpath({path:"//*[normalize-space()='Click Here To Accept!']//ancestor::a", all:true});
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;
  };