【问题标题】:How do I click on this button with Greasemonkey?如何使用 Greasemonkey 单击此按钮?
【发布时间】:2012-09-03 18:42:34
【问题描述】:

我是 JS 的新手,我正在尝试点击这个按钮:

<a class="simplebutton" href="javascript:void(0);">find</a>


这个按钮的XPath是:/html/body/div[5]/div/span[2]/a,目标页面的快照可以在this Fiddle看到。

这是我尝试过的,但它不起作用。 (我正在使用从http://code.google.com/p/getelementsbyclassname/ 获得的函数getElementsByClassName):

document.getElementsByClassName('simplebutton').submit();

【问题讨论】:

    标签: javascript click greasemonkey


    【解决方案1】:

    这是一个执行此操作的完整脚本。它使用 jQuery 处理 the :contains() selector

    更新:修改脚本以解决报告的 AJAX。

    // ==UserScript==
    // @name     _Click on a specific link
    // @include  http://YOUR_SERVER.COM/YOUR_PATH/*
    // @require  http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
    // @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
    // @grant    GM_addStyle
    // ==/UserScript==
    /*- The @grant directive is needed to work around a major design change
        introduced in GM 1.0.
        It restores the sandbox.
    */
    
    //--- Note that contains() is CASE-SENSITIVE.
    waitForKeyElements ("a.simplebutton:contains('follow')", clickOnFollowButton);
    
    function clickOnFollowButton (jNode) {
        var clickEvent  = document.createEvent ('MouseEvents');
        clickEvent.initEvent ('click', true, true);
        jNode[0].dispatchEvent (clickEvent);
    }
    

    注意:在某些情况下,contains() 术语可能会错误地触发。例如,如果有一个 &lt;a class="simplebutton"&gt;unfollow&lt;/a&gt; 按钮。
    这是防止错误点击的一种方法。像这样修改clickOnFollowButton函数:

    function clickOnFollowButton (jNode) {
        if ( ! /^\s*follow\s*$/i.test (jNode.text() ) ) {
            /*--- If the node contains anything but "follow" (surrounded by 
                optional whitespace), don't click it.
            */
            return false;
        }
        var clickEvent  = document.createEvent ('MouseEvents');
        clickEvent.initEvent ('click', true, true);
        jNode[0].dispatchEvent (clickEvent);
    }
    

    几件事:

    1. getElementsByClassName() 返回元素的列表或“集合”。你不能只是.submit() 那样的结果。 .submit() 用于单个元素。

    2. 由于这是一个链接.submit() 将不起作用。 .click() 通常会起作用,但通常不会——当链接由事件侦听器授权时(这个问题必须是这种情况)。

      上面给出的clickEvent 代码几乎适用于所有情况。

    3. The page code you gave 没有任何链接,带有class="simplebutton" 和包含find 的文本!

    4. 您使用的是什么浏览器?哪个 Greasemonkey 版本?什么操作系统?

    5. 查找并使用适当的 javascript 参考和适当的 DOM 参考。问题中列出的参考是针对不标准且未包含在您的脚本中的 library(很可能)。

    6. 使用 CSS 路径,它比 XPATH 更容易处理这种事情。 Firebug 会显示给定元素的 CSS 路径。
      jQuery 使用 CSS 选择器/路径,document.querySelector()(非 jQuery 方法)也是如此。

    【讨论】:

    • 感谢您的努力!我真的很感激。可悲的是,您的代码没有按预期工作。当然这是我的错,因为我不是专家,所以我提供了错误的信息。在我看来,我想单击的按钮是在加载初始页面后加载的,因此 GM 无法识别它。如果你有 instagram 账号可以登录本站:ink361.com,我想点击关注按钮。
    • 这是一个很大的遗漏。您可能应该对这两个答案都投赞成票以进行补偿。无论如何,我没有 instagram 帐户,但我将脚本更改为与 AJAX 一起使用的位置。无论该按钮何时出现,它都会触发。只需确保它是 follow 而不是 Follow(大小写对此至关重要)。
    • 感谢您的支持!现在它按预期工作:抱歉,如果我的问题没有应有的完整!
    • 这里只是另一个简单的问题:我有 waitForKeyElements ("a.simplebutton:contains('follow')", clickOnFollowButton);。如果包含“follow”这个词,这将触发,但是“unfollow”这个词也会触发。如何让它只在第一种情况下触发?
    • 更新了答案以解决这个问题。
    【解决方案2】:

    您需要使用方法click 而不是submit。提交表单时可以使用submit

    getElementsByClassName 还返回一个元素数组,你需要检索你想要的元素然后调用click 就可以了。

    document.getElementsByClassName('simplebutton')[0].click();​
    

    http://jsfiddle.net/kLDde/

    【讨论】:

    • @Giorgio 忘记从数组中选择一个元素。您不能单击通用数据结构,但可以单击 HtmlElement。
    • .click() 不能在任何地方工作,既然你已经抓住了这个事件,为什么你需要打电话给submit()
    • 现在我正在使用:document.getElementsByClassName('simplebutton')[0].click();但仍然没有点击
    • @Giorgio 你试过 jsfiddle 了吗?在您的问题示例中,单击链接时不应发生任何事情(您已通过添加 href="javascript:void(0);" 禁用了该链接)。可能存在跨浏览器问题,您使用的是什么浏览器?
    • 也许页面的内容是用ajax动态加载的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多