使用Javascript为页面上的多个按钮启动onClick()事件

使用Javascript为页面上的多个按钮启动onClick()事件,javascript,html,events,download,iteration,Javascript,Html,Events,Download,Iteration,我找到了一些关于类似主题的文章,但不幸的是,这些解决方案没有起作用。如果那是我的错误,请原谅我 背景 我有一个客户正在从一个基于web的pdf文档库提供商迁移到另一个提供商。当前的提供商无法导出他们的所有文档,除了我们进入并单击每个文档的下载。页面上有一个所有文档的列表,每个文档旁边都有下载按钮 我试着使用谷歌Chrome中的控制台来编写一个脚本来实现这一点 代码 所有下载按钮都具有类似的id名称结构,如下所示,其中数字递增: id=“mainForm:documentList:0:j\u id

我找到了一些关于类似主题的文章,但不幸的是,这些解决方案没有起作用。如果那是我的错误,请原谅我

背景 我有一个客户正在从一个基于web的pdf文档库提供商迁移到另一个提供商。当前的提供商无法导出他们的所有文档,除了我们进入并单击每个文档的下载。页面上有一个所有文档的列表,每个文档旁边都有下载按钮

我试着使用谷歌Chrome中的控制台来编写一个脚本来实现这一点

代码 所有下载按钮都具有类似的id名称结构,如下所示,其中数字递增:

id=“mainForm:documentList:0:j\u id\u 4d”
id=“mainForm:documentList:1:j\u id\u 4d”
id=“mainForm:documentList:2:j\u id\u 4d”

下面是一个示例按钮:

<button id="mainForm:documentList:0:j_id_4d" name="mainForm:documentList:0:j_id_4d" type="button" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" onclick="window.open('api/internal/documents/619c342f-e006-423e-b45b-43db822bd193','_self')" role="button" aria-disabled="false"><span class="ui-button-text ui-c">Download</span></button>
我可以看到按钮中填充了所有正确的按钮

当我使用此循环遍历所有按钮以启动onclick事件时,只有第一个onclick事件启动下载。为了调试,我还在for循环中添加了一个if条件,以测试特定索引是否会启动onclick下载事件(比如当我2岁时)以及pdf是否会下载

for (var i = 0; i < buttons.length; i++) {
        buttons[i].click();
}
for(变量i=0;i
我还可以在网络控制台中看到,第一个文件显示状态为200,其他文件显示状态为已取消

有些文章指出需要实现事件委托或侦听,我尝试过,但也没有成功。我不再是一个编程高手,而是一个超级用户。非常感谢您的任何见解

提前非常感谢!
Stephan

您可以使用此选择器获取所有按钮:

var buttons=document.querySelectorAll('[id^="mainForm:documentList:"][id$=":j_id_4d"]');
并使用forEach()遍历它们

然后为列表中的每个项目调用click

最终代码如下所示:

var buttons=document.querySelectorAll('[id^="mainForm:documentList:"][id$=":j_id_4d"]');
    
buttons.forEach(function(button){
    console.log(button);
    button.click();
});

这只是一个猜测
window.open()
通常在它不是来自用户操作时被阻止,因为浏览器可能认为这是某种弹出式骗局。我在浏览器中尝试了这个简单的程序:

<button onclick="clicked()">click me</button>
<button onclick="clicked()">click me</button>
<button onclick="clicked()">click me</button>
<button onclick="clicked()">click me</button>
<button onclick="clicked()">click me</button>
<button onclick="clicked()">click me</button>


<script>
  function clicked() {
    window.open('https://google.com', '_blank')
  }
  const buttons = document.querySelectorAll('button'); 
  buttons.forEach(button => button.click())
</script>
点击我
点击我
点击我
点击我
点击我
点击我
函数单击(){
打开窗户https://google.com“,”空白“)
}
const buttons=document.queryselectoral('button');
buttons.forEach(button=>button.click())
它不会正常工作。但是,如果我更改浏览器(chrome)中的设置以允许弹出窗口,那么一切都会按预期进行

您可能想试一试

问题在于窗口中的“\u self”。打开()按钮

当我删除这些引用时,所有的文件都下载得很好


谢谢你,散光

你有一个额外的}。。还可以尝试
buttons.forEach(button=>{button.click();})一行而不是循环谢谢@astigmatik的建议。我改变了,但它仍然只下载一个文件。嗯。想法?哦。。是你自己打破了窗户。打开()。。我想你每次都得换button@astigmatik当我进入并删除window.open()中的_self条目时,文件下载在我运行脚本后处理了一些按钮。你是个天才。问题是这不是我的页面,我需要手动执行数百次才能获取所有文件LOL。我想知道是否可以删除每个调用的foreach循环中的“\u self”?@astigmatik好的,我只是在控制台中使用搜索和替换,就像这样首先:``document.body.innerHTML=document.body.innerHTML.replace(/\u self/g,”)“``删除你自己,然后运行你的建议,它就会起作用。你太棒了。非常感谢。谢谢你的建议。它仍然只下载1个文件。我在上面添加了一些关于其他文件下载被取消的评论。有人建议说,窗户上的自我是个问题。谢谢您的帮助。是的,每个按钮都应该打开一个单独的选项卡或窗口。不要用你自己。
<button onclick="clicked()">click me</button>
<button onclick="clicked()">click me</button>
<button onclick="clicked()">click me</button>
<button onclick="clicked()">click me</button>
<button onclick="clicked()">click me</button>
<button onclick="clicked()">click me</button>


<script>
  function clicked() {
    window.open('https://google.com', '_blank')
  }
  const buttons = document.querySelectorAll('button'); 
  buttons.forEach(button => button.click())
</script>