【问题标题】:click() with links带有链接的 click()
【发布时间】:2012-04-03 20:25:58
【问题描述】:

我有一个页面,里面有几个链接都是这样的:

<a href="/" class="answer-item" rel="0">10</a>

我想使用click() 函数来模拟用户点击其中一个,但在我的测试中似乎不起作用。

//Evaluate a mathematical expression from another part of the page
var numberAnswer = eval(document.getElementById("question-title").getElementsByTagName("b")[0].innerHTML);

//Builds an array with the links that may match the expression
var choices = document.getElementsByClassName('answer-item');

//Iterates through array to find a match then clicks it
for(var i in choices){
    if(choices[i].innerHTML == numberAnswer){
        choices[i].click();
        break;
    }
}

我确定choices[i] 是正确的元素。

Firefox 什么都不做,Opera 什么也不做,并且 click() 在 Chrome 中不可用(我认为)。

另外,我尝试以这种形式使用dispatchEvent()

var evt = document.createEvent('MouseEvents');
evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
choices[i].dispatchEvent(evt);

这显然在 Firefox 和 Chrome 中返回了true,但没有改变任何东西。

最麻烦的部分是只有href 属性的链接与.click() 配合得很好。

【问题讨论】:

    标签: javascript html click dom-events


    【解决方案1】:

    编辑

    根据评论区的讨论,这个答案中使用的行为似乎是非标准的,或者至少在用户代理之间不一致。我正在进一步研究这个问题;如果您使用此答案中的信息,请仔细检查您在所有浏览器中的代码,以确保其按预期工作。


    编辑 2

    根据 OP 的评论,这里有一种“让它发生”的方法。它有一些缺点,即你的绑定事件不能调用preventDefault——这个方法不会尊重它。您可以构建某种可能能够处理此问题的事件包装器......无论如何,这是代码和小提琴:

    HTML:

    <br><br>
    <!-- I am totally misusing this API! -->
    <a href="http://jsfiddle.net/echo/js/?delay=0&js=The link was followed;" id="progra_link">Some link with an event that uses preventDefault()</a>
    <br><br>
    <button id="doit_btn">Programmatically click the link</button>
    

    脚本:

    function do_program_click () {
        var lnk = document.getElementById('progra_link');
        var loc = lnk.href;
        if (!loc)
            return false;            
        // call this to fire events
        lnk.click();
    
        // then follow the link
        document.location = loc;
        return;
    };
    function addEvent(element, evnt, funct){
      if (element.attachEvent)
       return element.attachEvent('on'+evnt, funct);
      else
       return element.addEventListener(evnt, funct, false);
    }
    
    // bind an event to the link to test force event trigger
    addEvent(
        document.getElementById('progra_link'),
        'click',
        function (e) {
            e.preventDefault();
            alert('Testing element click event, default action should have been stopped');
            return false;
        }
    );
    // bind event to the leeroy button
    addEvent(
        document.getElementById('doit_btn'),
        'click',
        do_program_click
    );
    

    jsFiddle:http://jsfiddle.net/CHMLh/


    原答案

    您的示例代码不完整。如果我只学习基础知识,它可以正常工作:

    <script>
       var lnk = document.getElementById('test');
       lnk.click();
    </script>
    <a id="test" href="/" class="answer-item" rel="0">test link</a>
    

    jsFiddle:http://jsfiddle.net/cgejS/

    我会重新评估您正在处理正确的 dom 元素的假设。

    在不相关的注释上,这是:

    var numberAnswer = eval(document.getElementById("question-title").getElementsByTagName("b")[0].innerHTML);
    

    ...什么? eval 是邪恶的——如果您出于任何原因使用它,请质疑您是否有正确的方法。您是否试图从字符串中获取整数?请参阅parseInt (docs),适合这项工作的工具:

    // this line is still failure-prone...
    var ele = document.getElementById("question-title").getElementsByTagName("b")[0];
    var numberAnswer = 0;
    if (ele)
       numberAnswer = parseInt(ele.innerHTML);
    

    【讨论】:

    • 不确定您使用的是什么浏览器,但在 Chrome 下您的代码什么也不做(即使 URL 不是 /
    • 嘿,你有那些文章吗?有趣的是......我发现很难证明它为什么在 Firefox 中有效,但所有迹象表明它不应该。 w3.org/TR/DOM-Level-2-HTML/html.html#ID-2651361 告诉我,在调用 click() 时,只有表单提交按钮应响应默认浏览器操作。我开始认为这是不合规行为甚至是错误......但如果你说除了 Chrome 之外的其他人都在这样做,那就提出了一个全新的问题!猜猜今晚谁会在 wc3\public-html 上发帖 :)
    • 啊,很公平。如果您正在 [eval] 评估数学表达式,那么这是 eval 是工作工具的罕见实例之一。我仍然会质疑在服务器端确定答案是否更快、更安全,但您比我更了解您的用例。:) 我仍在研究click() 是否应该的问题b> 工作与否,我没有找到任何确凿的证据表明它应该这样做。因此,我在这里的回答看起来并不是最好的方法。
    • 我刚刚用谷歌搜索了它。这是一篇“文章”:unitstep.net/blog/2010/04/12/…(根据它,没有浏览器支持它,但正如你所发现的,有些确实支持)
    • 查看第二个编辑,@MarkM - jsfiddle.net/CHMLh 有一个解决方案可以完成这项工作......脏
    【解决方案2】:

    简单。

    HTML(注意我添加了一个“id”标签):

    &lt;a id="answer-item" href="/" class="answer-item" rel="0"&gt;10&lt;/a&gt;

    JS:

    document.getElementById('answer-item').click();
    

    【讨论】:

    • 注意:这在 Chrome 上不起作用,但这是浏览器本身的限制
    • 添加 id 并使用 getElementById() 不起作用,但您能解释一下为什么会这样吗?我的代码已经获得了正确的元素。
    • 这并不“容易”——问题更复杂。有关更多信息,请参阅我的答案的评论讨论。基本上,我发现click() 在这种情况下不应该工作,它确实是非标准的和/或错误的事实。
    • 此外,由于 OP 正在计算一个值,然后迭代链接以找到匹配的值,因此使用 getElementById 是不可行的,而无需返回可以创建唯一的服务器端解决方案匹配id 的值,如document.getElementById('answernumber'+numberAnswer)
    猜你喜欢
    • 2018-12-05
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多