【问题标题】:JavaScript .click() in for loop only executes oncefor 循环中的 JavaScript .click() 只执行一次
【发布时间】:2015-03-02 04:15:21
【问题描述】:

我正在尝试在一个网站中模拟点击各种链接,并使用它们来扩展部分。开发人员没有费心添加“全部展开”,并且至少有 200 个按钮我不想点击,所以我想我会使用 JavaScript。但是欢迎任何其他想法。

我试图模拟点击的链接定义为:

<a id='a_link_1' href=...> ... </a>
<a id='a_link_2' href=...> ... </a>
<a id='a_link_3' href=...> ... </a>

我认为在 Google Chrome 的开发者控制台上使用类似的东西会起作用:

var level_one = [
    'a_link_1',
    'a_link_2',
    'a_link_3'
];

for (var i = 0; i < level_one.length; i++) {
    document.getElementById(level_one[i]).click();
}

问题在于它只适用于第一个链接。如果我更改链接的顺序,它仍然只适用于第一个。实际上,我尝试设置一个计时器来稍微思考一下可以解决问题,但事实并非如此。

为什么它没有激活所有链接?正确的方法是什么?谢谢!

如果你想测试一下,网站是:http://www3.inegi.org.mx/sistemas/saic/(它是西班牙语)。


编辑: @chiliNUT 的答案对我来说是最有用的,所以我把它放在这里,因为我不能将它标记为接受的答案,因为它没有作为一个提交。

总结一下,

clickables = document.querySelectorAll('a[href^="javascript:"]'); 
for (i in clickables) { clickables[i].click(); }

将检索具有以“javascript”开头的链接关联的所有对象(用于触发扩展链接)。 for loop 实际上是一个一个地模拟对它们的点击(小心!您最终可能会模拟对您不想要的东西的点击)。

就是这样。感谢@chiliNUT 提供该解决方案。

【问题讨论】:

  • 我无法复制这个,更不用说那个页面上没有名为“a_link_1”、“a_link_2”、“a_link_3”的链接,所以我无法重现这个问题,所以我可以没有更多信息就帮不了你:)
  • 运行这段代码以尝试触发每个单击事件都可以正常工作,因此我需要有关您尝试激活的特定链接的更多信息:clickables=document.querySelectorAll('a[href^="javascript:"]'); for (i in clickables) { clickables[i].click(); }
  • 提供的页面不包含这些链接
  • 浏览器/javascript引擎是否会因为单击锚标记(第一个)而导致脚本结束?我不确定是否可以将其发布为答案,只是可能?
  • 以下链接可能对您的问题有所帮助。 *.com/questions/11135932/…

标签: javascript html for-loop


【解决方案1】:

使用 jQuery:

        $(level_one.map(function(e){return '#'+e}).join(',')).each(function(e,index){
                 setTimeout(function(){$(e).trigger('click')},index*1000)
});
      
  • a#a_link_1 将立即触发(0 超时)
  • a#a_link_2 将在 1 秒后触发(1000 毫秒超时)
  • a#a_link_3 将在 2 秒后触发(2000 毫秒超时)

.....

  • a##a_link_n 将在 (n-1) 秒后触发

注意

  • level_one.map(function(e){return '#'+e}).join(',') 相当于:'#a_link_1,#a_link_2,#a_link_3'

【讨论】:

  • 这段代码显示了控制台上的链接信息,但实际上并没有展开这些部分。不过,谢谢。
【解决方案2】:

尝试使用jQuery

for (var i = 0; i < level_one.length; i++) {
    $("#"+level_one[i]).trigger("click");
}

【讨论】:

  • 如果您可以编辑您的答案并解释您显示的代码的作用,以及该代码为何/如何回答问题,这将使您的答案更有帮助。
  • 此代码无效。它不会触发任何链接。不过,谢谢。
  • @otreav 你可以创建一个 jsfiddle 以便我们进行更改和检查
【解决方案3】:

使用下面的 jQuery 代码,

 jQuery.each( level_one, function( i, val ) {
      $( "#" + val ).click();
 });

【讨论】:

  • 这与 OP 有什么不同(除了效率低得多)? (至少正确格式化代码……)
  • 此代码无效。它不会触发该网站中的任何链接。不过,谢谢。
最近更新 更多