通过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..></a> </td> <td align="right">2015-09-05 09:50 </td> <td align="right">4.3K</td> <td> </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");