For 循环上的 Click() 仅适用于第一个按钮

时间:2020-12-24 21:17:26

标签: javascript

所以我目前正在创建一个测试脚本,其中一个场景是根据 aria-label 单击不同的按钮组。

这是一个非常直接的 JS,我在其中执行查询选择器 all 并单击所有需要的按钮,但由于某种原因,只有第一个按钮被单击。

起初我认为这可能是竞争条件,所以我添加了延迟

我的代码:

var share = document.querySelectorAll("[aria-label='SubmitDoc']");
for (let i = 0, len = share.length; i < len; i++) {
  setTimeout(function () {
    console.log(share[i]);
    share[i].click();
  },2000 * i);
}
<div aria-label="SubmitDoc" class="btn-submit" role="button" tabindex="0"></div>    
<div aria-label="SubmitForm" class="btn-submit" role="button" tabindex="0"></div>
<div aria-label="SubmitClass" class="btn-submit" role="button" tabindex="0"></div>
<div aria-label="SubmitDoc" class="btn-submit" role="button" tabindex="0"></div>
<div aria-label="SubmitForm" class="btn-submit" role="button" tabindex="0"></div>
<div aria-label="SubmitClass" class="btn-submit" role="button" tabindex="0"></div>
<div aria-label="SubmitFinal" class="btn-submit" role="button" tabindex="0"></div>
<div aria-label="SubmitFinal" class="btn-submit" role="button" tabindex="0"></div>

我错过了什么吗?

1 个答案:

答案 0 :(得分:-1)

您基本上缺少一个闭包。因为您正在 setTimeout 中运行单击,所以当它触发循环时,循环已经运行并且 i 的值已经是它的最大值。你可以这样解决:

var submitDoc = document.querySelectorAll("[aria-label='SubmitDoc']")
var doClick = function (node, delay) {
  setTimeout(function () {
    node.click();
  }, delay);
}
for (let i = 0, len = share.length; i < len; i++) {
  doClick(share[i], 2000 * i);
}