循环内部的JQuery load()



我正在尝试编写一个Greasemonkey脚本,其中不同的页面使用for循环加载.load(),并将它们的一些信息存储在localStorage中。我的问题是:因为.load()是异步的,所以它不能很好地工作。我的脚本只存储我试图存储的Last值。我认为这是因为我在回调函数中使用了var i,并且当回调函数被触发时,i已经有了另一个值。

for (var i = 0; i < plantsDiv.length; i++)
{
   objectid = plantsDiv[i].getAttribute('objectid');    
   $("#wrap").load("index.php?objectid="+ objectid,function(){
      //[...] what is happening
      window.localStorage.setItem(objectid,value);
   });
}

当我在回调函数和for循环结束之间插入alert("foo")时,一切都正常,因为.load函数已加载,而我正在警报窗口中单击"确定"。有没有办法让for循环等待整个.load被执行?

谢谢你的帮助,也很抱歉我英语不好:)

load()函数与get()函数非常相似

此方法是从服务器获取数据的最简单方法。是的大致相当于$.get(url、data、success),只是它是方法而不是全局函数,并且它有一个隐式回调作用

通过使用稍微详细一点的ajax()函数,您将能够指定请求为同步async设置为false。也许这会解决你的问题。

一个简单的同步ajax调用:

$.ajax({
  url: "example.php",
  data : yourData,
  async : false
},function(response){
  // this is the callback
});

参考资料-

  • $.ajax()
  • $.get()
  • load()

如果目标不是将内容加载到元素中,而是获取内容并将其保存到localStorage中,则应该使用$.get(如果要发布数据,则使用$.post)。

jQuery ajax函数返回一个jqXHR对象,该对象派生自Deferred对象,因此可以使用.done()表示成功,使用.fail()表示失败:

$.get("index.php?objectid="+ objectid)
.done(function(data) {
    window.localStorage.setItem(objectid,data);
})
.fail(function() {
    // try again later?
});

编辑:请注意,请求仍将异步启动,在这种情况下,您可能有很多并行请求,当收到每个请求的响应时,完成(或失败)块中的代码将运行。

最新更新