在jquery AJAX成功回调中将变量传递给函数

在jquery AJAX成功回调中将变量传递给函数,jquery,ajax,callback,Jquery,Ajax,Callback,我正试图用jqueryajax调用预加载一些图像,但在将(url)字符串传递到AJAX调用的success函数中时遇到了实际问题(如果有意义的话) 以下是我目前的代码: //preloader for images on gallery pages window.onload = function() { setTimeout(function() { var urls = ["./img/party/"]; //just one to get started

我正试图用jqueryajax调用预加载一些图像,但在将(url)字符串传递到AJAX调用的success函数中时遇到了实际问题(如果有意义的话)

以下是我目前的代码:

//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);
};
我尝试将
image\u链接(data,I)
放在这里、那里和任何地方(在每个嵌套函数中等),但我得到了相同的结果:
I
的值只记录为3。我怀疑这是因为对
I
的所有引用都指向同一个对象,并且当异步任务实际到达
image\u链接(data,I)
时,
for…
循环已经结束并完成(因此具有3的值)。不用说,这将
url[i]
视为“未定义”

有(更多)的建议吗?我该如何度过这一关

尝试以下方法(使用this.url获取url):


摘自

您不能像这样传递参数-成功对象映射到一个带有一个参数的匿名函数,这就是接收到的数据。在for循环之外创建一个函数,该函数将
(数据,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)
}

为了与大家分享我遇到的一个类似问题,以防它可能会对某些人有所帮助,我使用了:

var NextSlidePage = $("bottomcontent" + Slide + ".html");
为load函数创建变量,但我应该使用:

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


不知道为什么,但现在它工作了!谢谢,我终于从这篇文章中看到了问题所在

由于设置对象绑定到该ajax调用,您可以简单地将索引器添加为自定义属性,然后使用成功回调中的
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);       
};
//库页面上图像的预加载程序
window.onload=函数(){
var url=[“/img/party/”、“/img/wedding/”、“/img/wedding/tree/”];
setTimeout(函数(){
对于(var i=0;i
编辑:添加更新的JSFIDLE示例,因为它们似乎已经改变了ECHO端点的工作方式:

要了解其工作原理,请参见ajaxSettings对象上的“上下文”字段,特别是以下注释:

“所有回调中的
this
引用是在设置中传递给$.ajax的上下文选项中的对象;如果上下文不是 指定时,这是对Ajax设置本身的引用。”


我最近遇到了这个问题。当文件名长度大于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);
   }
});

您还可以使用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);  }
});

我被success函数中的第二个参数(url)弄糊涂了。这个参数指的是操作的状态,并且您正在使用它(在作用域中)作为url?是的。原来我更糊涂了!谢谢,我不知道-这将解释为什么我在
.each()
位中获得
url
的数字。返回的“数据”是什么样子的。是html吗?jQuery“contains”只返回元素的文本,而不是src或hrefs。我从这里得到了最初的想法和代码——在这里一切正常(即,
数据中的内容)。我想我增加了一点复杂性,并打破了它。不管怎样,我只是在上面发布了我的修改…仍然是坏的。你知道你要加载的图像的文件名吗,或者你正在加载存储在特定文件夹中的所有图像,在这些文件夹中可以添加和/或删除图像?谢谢-我查看了这篇文章并编辑了原始qn。仍然有一些问题。感谢您的编码演示。下次我会努力做得更好。为什么这没有记录?!?事实上,无论多么隐蔽,这里都有记录。请参阅设置的上下文属性。@codyc4321您能详细说明一下吗?这个问题已经为我赢得了大量的选票,因此如果由于jQuery更新而不再有效,也许我可以更新答案。谢谢这太棒了。我只是将它改为“that”,而不是indexValue,以使它更通用。var that=这个。那个;把它装起来。通过这种方式,当您可以只发送数组中的项以避免在等待ajax成功事件触发时对数组可能发生的更改时,为什么还要发送索引?@Erutan409据我所知,使用JQuery 3.2.1仍然有效。请注意,“indexValue”字段可以读取任何内容。我已经用小提琴证明了这一点。希望有帮助。回答得很好!这是传递变量的最佳方法之一
<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>
$(data).find("[href$='.jpg'],[href$='.png']").each(function() {  
var image = $(this).attr("href");
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);  }
});