JQuery的 - 里面循环播放.load()“为”语句(JQuery - Looping a .l

2019-09-30 09:36发布

我不知道这是否会实际上是不可能的,因为负载()是一个异步方法,但我需要一些方法来基本加载的页面数小块,一次一个,获得通过JavaScript包含在其中的一些数据,和然后发送通过Ajax过来,让我可以把我做了一个数据库。

基本上,我从我的网页,所有的环节我会不得不遍历位于得到这样的:

var digiList = $('.2u');
var link;
for(var i=0;i<digiList.length;i++){

    link = "http://www.digimon-heroes.com" + $(digiList).eq(i).find('map').children().attr('href');

到现在为止还挺好。

现在,我将不得不加载每个链接到一个div我有我的页面各处地方(只有完整的页面,而不是整个事情的具体DIV),这样我可以通过JQuery得到一些数据:

 var contentURI= link + ' div.row:nth-child(2)';   

    $('#single').load('grabber.php?url='+ contentURI,function(){     
 ///////////// And I do a bunch of JQuery stuff here, and save stuff into an object 
 ///////////// Aaaand then I call up an ajax request.
     $.ajax({
      url: 'insertDigi.php',
      type: 'POST',
      data: {digimon: JSON.stringify(digimon)},
      dataType: 'json',
      success: function(msg){
        console.log(msg);
      }
 ////////This calls up a script that handles everything and makes an insert into my database.
    }); //END ajax
   }); //END load callback Function
  } //END 'for' Statement.
 alert('Inserted!'); 

当然,正如所预料的,加载时间过长,而for语句其余的只是不断经历,没有真正关心让负载完成了它的业务,由于负载是异步的。 警报( '插入!'); 之前,我甚至去加载第一页的机会被调用。 这反过来又意味着,我只得到了东西加载到我的div之前,我甚至可以把它的信息,并将其发送到我的脚本。

所以我的问题是:有没有在这样,我可以通过多条链路迭代,加载它们的方式做到这一点一些有创意的方式,做我的事与他们,并用它做什么? 如果没有,是否有一个同步的替代加载,这可能会产生大致相同的效果呢? 我知道,它可能会完全阻止了我的网页,但我会与它的罚款,因为该页面不从我不需要任何输入。

希望我解释了一切必要的细节,希望你们能帮助我了这一点。 谢谢!

Answer 1:

你可能需要一个递归函数,即等待一个迭代,才去到下一个迭代等。

(function recursive(i) {
    var digiList = $('.2u');
    var link = digiList.eq(i).find('map').children().attr('href') + ' div.row:nth-child(2)';
    $.ajax({
        url: 'grabber.php',
        data: {
            url: link
        }
    }).done(function(data) {

        // do stuff with "data"

        $.ajax({
            url: 'insertDigi.php',
            type: 'POST',
            data: {
                digimon: digimon
            },
            dataType: 'json'
        }).done(function(msg) {
            console.log(msg);
            if (i < digiList.length) {
                recursive(++i); // do the next one ... when this is one is done
            }
        });
    });
})(0);


Answer 2:

万一你希望他们一起运行,您可以使用封闭保存在每个循环数

for (var i = 0; i < digiList.length; i++) {
    (function(num) { < // num here as the argument is actually i
        var link = "http://www.digimon-heroes.com" + $(digiList).eq(num).find('map').children().attr('href');
        var contentURI= link + ' div.row:nth-child(2)';   
        $('#single').load('grabber.php?url=' + contentURI, function() {
            ///////////// And I do a bunch of JQuery stuff here, and save stuff into an object 
            ///////////// Aaaand then I call up an ajax request.
            $.ajax({
                url: 'insertDigi.php',
                type: 'POST',
                data: {
                    digimon: JSON.stringify(digimon)
                },
                dataType: 'json',
                success: function(msg) {
                        console.log(msg);
                    }
                    ////////This calls up a script that handles everything and makes an insert into my database.
            }); //END ajax
        }); //END load callback Function
    })(i);// <-- pass in the number from the loop
}


Answer 3:

您可以随时使用同步AJAX,但没有很好的理由。

如果你知道你需要下载文件的数量(你可以指望他们或只是硬编码,如果是常数),你可以运行成功的一些回调函数,如果一切都做,然后用需要的所有文件的逻辑进行。

为了使其更好,你可以只触发一个事件(在文档或任何其他对象)时,一切都被下载(例如“downloads_done”),并听取关于这甚至让你需要做什么。

但是,所有上述是你需要的时候都做是为了做一些事情的情况。 但是我不知道如果我理解正确你的问题(只是再次阅读本)。

如果你要下载的东西 - >做数据的东西 - >下载另一件事 - >再做些什么?

那么你也可以使用JavaScript瀑布(库或建立你自己的),使之简单,使用方便。 在瀑布定义时异步功能完成后,一个接一个会发生什么。



文章来源: JQuery - Looping a .load() inside a 'for' statement