3

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

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

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

最麻烦的部分是只有href属性的链接可以正常工作.click()

4

2 回答 2

3

编辑

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


编辑 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文档),这项工作的正确工具:

// this line is still failure-prone...
var ele = document.getElementById("question-title").getElementsByTagName("b")[0];
var numberAnswer = 0;
if (ele)
   numberAnswer = parseInt(ele.innerHTML);
于 2012-04-03T20:35:45.887 回答
0

简单的。

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

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

JS:

document.getElementById('answer-item').click();
于 2012-04-03T20:39:54.847 回答