jQuery如何?将附加参数传递给$ .ajax调用的成功回调?

时间:2010-04-08 19:54:14

标签: jquery jquery-callback

我试图将其他参数传递给我为成功的ajax调用创建的成功回调方法,但是徒劳无功。一点背景。我有一个页面,其中包含许多动态创建的文本框/选择框对。每对都有一个动态分配的唯一名称,例如name =“unique-pair-1_txt-url”和name =“unique-pair-1_selectBox”,那么第二对具有相同但前缀不同。

为了重用代码,我精心设计了回调来获取数据和对selectbox的引用。但是当回调被触发时,对selectbox的引用将返回为“undefined”。我读here它应该是可行的。我甚至尝试过利用'上下文'选项,但仍然没有。这是我尝试使用的脚本块:

<script type="text/javascript" language="javascript">
$j = jQuery.noConflict();
function getImages(urlValue, selectBox) {
    $j.ajax({
        type: "GET",
        url: $j(urlValue).val(),
        dataType: "jsonp",
        context: selectBox,
        success:function(data){
         loadImagesInSelect(data)
        } ,
        error:function (xhr, ajaxOptions, thrownError) {
            alert(xhr.status);
            alert(thrownError);
        }

    });
}

function loadImagesInSelect(data) {
var select = $j(this);
select.empty();
$j(data).each(function() {
    var theValue = $j(this)[0]["@value"];
    var theId = $j(this)[0]["@name"];
    select.append("<option value='" + theId + "'>" + theValue + "</option>");
});
select.children(":first").attr("selected", true);

}    
</script>

从我所看到的,我觉得我很接近,但我不能把手指放在缺失的环节上。请帮助你典型的忍者隐身方式。 TIA

**** **** UPDATE 尼克是一个真正的忍者。他们应该为此发明一个新的徽章!他下面的回答就是诀窍。正如他提到的那样具体是1.4,但我可以忍受。这是我的最终代码,适用于任何Ninjas的培训(以及我未来的参考):

<script type="text/javascript" language="javascript">
$j = jQuery.noConflict();
function getImages(urlValue, selectBox) {
    $j.ajax({
        type: "GET",
        url: urlValue+ '?callback=?',
        dataType: "jsonp",
        context: selectBox,
        success: jQuery.proxy(function (data) {
            var select = $j(this);
            select.empty();
            $j(data).each(function() {
                var theValue = $j(this)[0]["@value"];
                var theId = $j(this)[0]["@name"];
                select.append("<option value='" + theId + "'>" + theValue + "</option>");
            });
            select.children(":first").attr("selected", true);
        }, selectBox),
        error:function (xhr, ajaxOptions, thrownError) {
            alert(xhr.status);
            alert(thrownError);
        }
    });
}
</script>

5 个答案:

答案 0 :(得分:22)

这就是我所做的,它也运行良好:

$.ajax('URL', {
    myCustomControl: selectBox,
    myCustomVariable: 'teste',
    data:
    {
       myData: 1
    },
    success: function (data, textStats, jqXHR) {
        myFunction(data, textStats, jqXHR, this.myCustomControl, this.myCustomVariable);
    }   
});

您可以将控件和变量添加到ajax调用的参数中。

答案 1 :(得分:12)

更新:如果你正在使用jQuery 1.4,请使用它来简化一些事情:

success: jQuery.proxy(function (data) {
    var select = $j(this);
    select.empty();
    $j(data).each(function() {
        var theValue = $j(this)[0]["@value"];
        var theId = $j(this)[0]["@name"];
        select.append("<option value='" + theId + "'>" + theValue + "</option>");
    });
    select.children(":first").attr("selected", true);
}, selectBox)

答案 2 :(得分:12)

将它放入$ .ajax参数中。

invokedata: {
    data1: "yourdata",
    data2: "moredata"
}

在成功功能中使用它

this.invokedata.data1;
this.invokedata.data2;

您的$ .ajax调用和成功函数也必须是同一对象的一部分。将您的函数放在一个对象中并像这样定义它们

function myObject {
    var getImage = function(..) { }
    var loadImagesInSelect = function(..) { }
}

答案 3 :(得分:3)

this超出范围

正如您(或其他任何人)理解 1 ,原始示例中thisloadImagesInSelect()未定义的原因是因为该功能不足不同的范围和范围不要级联&#34;喜欢 2

当您指定&#34; context&#34;在你的AJAX调用中selectBox,它设置了给&#34;成功&#34;的函数的上下文(this)。和&#34;错误&#34;。 (恰好它们都是匿名函数。)此时,this在这两个函数中定义为selectBox的值。现在,在传递给&#34;成功&#34;的函数中,您调用loadImagesInSelect()。调用函数时,它会创建一个新范围。在此范围内,this在非严格模式下为window,在严格模式下为undefined


以图形方式放置(在严格模式 3 中):

// this = window (global scope)

$j = jQuery.noConflict();
function getImages(urlValue, selectBox) {

    // this = undefined (function scope level 1)

    $j.ajax({
        type: "GET",
        url: $j(urlValue).val(),
        dataType: "jsonp",
        context: selectBox,
        success: function(data) {

            // this = selectBox (function scope level 2)

            loadImagesInSelect(data);
        },
        error: function(xhr, ajaxOptions, thrownError) {

            // this = selectBox (function scope level 2)

            alert(xhr.status);
            alert(thrownError);
        }
    });
}

function loadImagesInSelect(data) {

    // this = undefined (function scope level 3)

    var select = $j(this);
    select.empty();
    $j(data).each(function() {
        var theValue = $j(this)[0]["@value"];
        var theId = $j(this)[0]["@name"];
        select.append("<option value='" + theId + "'>" + theValue + "</option>");
    });
    select.children(":first").attr("selected", true);
}

$.proxy()是Redundant

在更新的代码中使用$.proxy()是多余的。您使用$.proxy()获取this以前称为loadImagesInSelect()的函数,但您将该函数移至&#34;成功&#34;无论如何(而不是从内部调用#34;成功&#34;)。它现在已经可以访问由&#34; context&#34;指定的this的值。

您可以删除{&#34;成功&#34;周围的$.proxy()包装。在更新后的代码中运行,它仍然有效。

我知道你提出问题已有好几年了,但我希望这会有所帮助。


  1. 我希望这并不像居高临下一样;它并不意味着。
  2. 至少,当你调用一个函数而不是上下文时。如果在函数内定义函数(即闭包),那么外部函数中的任何变量都将在内部函数中可用。 但是,外部函数的上下文(this变量)在内部函数中仍然不可用。
  3. undefined替换为window非严格模式。
  4. 或ECMAScript 5中的原生Function.prototype.bind()

答案 4 :(得分:0)

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