首页 > 解决方案 > 我正在尝试在 javascript 循环中发送 get 或 post 请求,但 .click() 只处理一次

问题描述

请原谅我对网络编码的无知。我这样做只是为了自动化一项一次性但意义重大的任务。我正在尝试从没有内置功能的在线资源下载许多 pdf。在一个单独的线程上,我了解到我被禁止将下载属性添加到锚点,因为代码不在同一个来源。因此,我在 Chrome 中发现的解决方法可以将 pdf 设置为下载而不是打开。这需要我访问每个 pdf 链接。所以我写了一些 php 来重定向到给定的 url,现在我只需要一种方法来遍历每个 url。我能够获取文件的所有 url 并将它们放入数组或文本文件中。我只是不知道如何遍历每个 url 并在每次加载新的 pdf 时强制 chrome 下载。

我对任何可以完成这项工作的方法持开放态度。我得到的唯一结果是数组中的最后一个 url 被触发,并且之前的所有 url 都被忽略了。

我尝试通过 javascript get 提交表单或向 php 发布请求,将“位置”标头更改为传递的 url。

我试过 window.location.replace(urls[index]);

我已经阅读了有关 javascript 的“关闭”问题,但我发现的解决方案也不能解决这个问题。这是我目前拥有的:

Html/JavaScript 代码:

<!DOCTYPE html>
<html>
<head>
</head>
<body>
    <form type="hidden" id="trigger" action="test.php" method="get"><br></form>
    <script>

        //create inputs
        document.getElementById("trigger").style.display = 'none';
        var dummy_input = document.createElement('input');
        dummy_input.name = 'url';
        dummy_input.type = 'text';

        var dummy_input2 = document.createElement('input');
        dummy_input2.type = 'submit';

        //append to form element
        trigger.appendChild(dummy_input);
        trigger.appendChild(dummy_input2);

        var urls = [
        "https://some_url.com/1",
        "https://some_url.com/2"
        ];
        for(var i = 0;i < urls.length; i++){
            (function(){
                var ii = i;
                setTimeout(function(){  
                dummy_input.value = urls[ii];
                dummy_input2.click(); 
                },500);
            })();
        }       
    </script>
</body>

php代码:

<?php
$url = $_GET["url"];
ob_start();
    while (ob_get_status()) { ob_end_clean(); }
    header( "Location: $url" );
?>

最终结果应该是我的数组或 txt/csv 文件中的每个 url 都被导航到,导致 chrome 下载文件,然后移动到下一个 url 等等。我尝试过的任何方法都只会触发最后一个 url。(再次抱歉,我不知道如何在这里......但在我来到这里之前我已经研究了好几个小时。)非常感谢任何帮助!

标签: javascriptphphtml

解决方案


你需要传递i给闭包

var urls = [
  "https://some_url.com/1",
  "https://some_url.com/2"
];
for (var i = 0; i < urls.length; i++) {
  (function(i) {
    var ii = i;
    setTimeout(function() {
      console.log(i)
      dummy_input.value = urls[i];
      dummy_input2.click();
    }, 500);
  })(i); // i added here
}

或者,您可以使用let而不是var

var urls = [
  "https://some_url.com/1",
  "https://some_url.com/2"
];
for (let i = 0; i < urls.length; i++) {
  setTimeout(function() {
    console.log(i)
    dummy_input.value = urls[i];
    dummy_input2.click();
  }, 500);

}


推荐阅读