通过variables在jQuery AJAX成功callback函数

我试图用jQuery AJAX调用预加载一些图像,但是在AJAX调用的成功函数中(如果有意义的话),将(url)string传递给函数时遇到了实际问题。

这里是我的代码,如下所示:

//preloader for images on gallery pages window.onload = function() { setTimeout(function() { var urls = ["./img/party/"]; //just one to get started for ( var i = 0; i < urls.length; i++ ) { $.ajax({ url: urls[i], success: function(data,url) { $(data).find("a:contains(.jpg)").each(function(url) { new Image().src = url + $(this).attr("href"); }); } }); }; }, 1000); }; 

人们可以看到我的(失败)尝试将URL传递给.each()调用 – url最终取值为递增整数。 不知道为什么或这些涉及到什么,也许是JPG文件的数量?

…无论如何,它当然应该在我原来的URL数组中的单个值。

感谢任何帮助 – 我似乎总是与这些callback有点纠结。


陆侃?

所以,我瞎了一下,注意@ron tornambe和@PiSquared的意见,现在在这里:

 //preloader for images on gallery pages window.onload = function() { var urls = ["./img/party/","./img/wedding/","./img/wedding/tree/"]; setTimeout(function() { for ( var i = 0; i < urls.length; i++ ) { $.ajax({ url: urls[i], success: function(data) { image_link(data,i); function image_link(data, i) { $(data).find("a:contains(.jpg)").each(function(){ console.log(i); new Image().src = urls[i] + $(this).attr("href"); }); } } }); }; }, 1000); }; 

我试图把image_link(data, i)在这里和每个地方(在每个嵌套的函数等),但我得到的结果相同: i的值只有logging为3.我怀疑这是因为所有引用i指向同样的事情,并在asynchronous任务实际上到达image_link(data, i)for...循环结束并完成(因此具有值3)。 不用说,这给了urls[i]为'undefined'。

任何(更多)提示我如何能得到这个?

我只是遇到类似的问题,相信我find了一个解决scheme。

由于设置对象绑定到ajax调用,您可以简单地添加索引器作为自定义设置,然后您可以在成功callback中使用this

 //preloader for images on gallery pages window.onload = function() { var urls = ["./img/party/","./img/wedding/","./img/wedding/tree/"]; setTimeout(function() { for ( var i = 0; i < urls.length; i++ ) { $.ajax({ url: urls[i], indexValue: i, success: function(data) { image_link(data , this.indexValue); function image_link(data, i) { $(data).find("a:contains(.jpg)").each(function(){ console.log(i); new Image().src = urls[i] + $(this).attr("href"); }); } } }); }; }, 1000); }; 

希望这个技巧。

您不能像这样传递参数 – 成功对象映射到具有一个参数的匿名函数,这就是接收到的数据。 在for循环之外创build一个以(data, i)为参数并在其中执行代码的函数:

 function image_link(data, i) { $(data).find("a:contains(.jpg)").each(function(){ new Image().src = url[i] + $(this).attr("href"); } } ... success: function(data){ image_link(data, i) } 

尝试这样的(使用this.url来获取url):

 $.ajax({ url: 'http://www.example.org', data: {'a':1,'b':2,'c':3}, dataType: 'xml', complete : function(){ alert(this.url) }, success: function(xml){ } }); 

从这里采取

您还可以使用indexValue属性通过对象传递多个参数:

 var someData = "hello"; jQuery.ajax({ url: "http://maps.google.com/maps/api/js?v=3", indexValue: {param1:someData, param2:"Other data 2", param3: "Other data 3"}, dataType: "script" }).done(function() { console.log(this.indexValue.param1); console.log(this.indexValue.param2); console.log(this.indexValue.param3); }); 

我这样做:

  function f(data,d){ console.log(d); console.log(data); } $.ajax({ url:u, success:function(data){ f(data,d); } }); 

只是为了分享一个类似的问题,以防万一它可能帮助一个,我正在使用:

 var NextSlidePage = $("bottomcontent" + Slide + ".html"); 

使负载函数的variables,但我应该使用:

 var NextSlidePage = "bottomcontent" + Slide + ".html"; 

没有$( )

不知道为什么,但现在它的作品! 谢谢,最后我看到这个post出了什么问题!

我最近遇到了问题。 当文件名长度大于20个字符时,麻烦来了。 所以旁路是改变你的文件名的长度,但诀窍也是一个很好的。

 $.ajaxSetup({async: false}); // passage en mode synchrone $.ajax({ url: pathpays, success: function(data) { //debug(data); $(data).find("a:contains(.png),a:contains(.jpg)").each(function() { var image = $(this).attr("href"); // will loop through debug("Found a file: " + image); text += '<img class="arrondie" src="' + pathpays + image + '" />'; }); text = text + '</div>'; //debug(text); } }); 

经过更多的调查麻烦来自ajax请求:请注意ajax返回的html代码:

 <a href="Paris-Palais-de-la-cite%20-%20Copie.jpg">Paris-Palais-de-la-c..&gt;</a> </td> <td align="right">2015-09-05 09:50 </td> <td align="right">4.3K</td> <td>&nbsp;</td> </tr> 

正如你所看到的,文件名在字符20之后被分割,所以$(data).find("a:contains(.png))不能find正确的扩展名。

但是,如果您检查href参数的值,它将包含文件的全名。

我不知道我是否可以要求Ajax返回文本区域的完整文件名?

希望清楚

我find了正确的testing来收集所有文件:

 $(data).find("[href$='.jpg'],[href$='.png']").each(function() { var image = $(this).attr("href");