首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在jquery AJAX成功回调中将变量传递给函数

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

Stack Overflow用户
提问于 2013-08-24 09:15:45
回答 7查看 141.4K关注 0票数 75

我正在尝试使用jQuery AJAX调用预加载一些图像,但在将(url)字符串传递到AJAX调用的成功函数内的函数时遇到了真正的问题(如果这有意义的话)。

下面是我的代码:

//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文件的数量?

...anyway,它当然应该接受我的原始urls数组中的单个值。

谢谢你的帮助-我似乎总是在这些回调中遇到一些麻烦。

进程?

所以,我花了点心思,注意到@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的值只记录为3。我怀疑这是因为所有对i的引用都指向相同的东西,当异步任务实际到达image_link(data, i)时,for...循环已经结束了(因此值为3)。不用说,这会将urls[i]设置为“未定义”。

有什么(更多)小贴士可以帮我解决这个问题吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-12-05 03:25:52

由于设置对象绑定到该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);       
};

编辑:添加了一个更新的JSFiddle示例,因为它们似乎已经更改了它们的回显端点的工作方式:https://jsfiddle.net/djujx97n/26/

要了解这是如何工作的,请参阅ajaxSettings对象上的"context“字段:http://api.jquery.com/jquery.ajax/,特别是下面的注释:

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

票数 185
EN

Stack Overflow用户

发布于 2016-05-24 14:49:35

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

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);
}); 
票数 13
EN

Stack Overflow用户

发布于 2013-08-24 09:28:20

尝试如下操作(使用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){
    }
});

摘自here

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18413969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档