我试图将其他参数传递给我为成功的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>
答案 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 ,原始示例中this
中loadImagesInSelect()
未定义的原因是因为该功能不足不同的范围和范围不要级联&#34;喜欢 2 。
当您指定&#34; context&#34;在你的AJAX调用中selectBox
,它设置了给&#34;成功&#34;的函数的上下文(this
)。和&#34;错误&#34;。 (恰好它们都是匿名函数。)此时,this
在这两个函数中定义为selectBox
的值。现在,在传递给&#34;成功&#34;的函数中,您调用loadImagesInSelect()
。调用函数时,它会创建一个新范围。在此范围内,this
在非严格模式下为window
,在严格模式下为undefined
。
// 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()
包装。在更新后的代码中运行,它仍然有效。
我知道你提出问题已有好几年了,但我希望这会有所帮助。
this
变量)在内部函数中仍然不可用。undefined
替换为window
非严格模式。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);
});