JQuery КАК? передать дополнительные параметры для успешного обратного вызова для вызова $.ajax?
Я тщетно пытаюсь передать дополнительные параметры методу обратного вызова success, который я создал для успешного вызова ajax. Немного предыстории. У меня есть страница с несколькими динамически создаваемыми парами textbox / selectbox. Каждая пара, имеющая динамически назначаемое уникальное имя, такое как name="unique-pair-1_txt-url" и name="unique-pair-1_selectBox", тогда вторая пара имеет то же самое, но префикс отличается.
Чтобы повторно использовать код, я создал обратный вызов для получения данных и ссылки на окно выбора. Однако, когда сработает обратный вызов, ссылка на окно выбора возвращается как "неопределенное". Я читал здесь, что это должно быть выполнимо. Я даже пытался воспользоваться возможностью "контекста", но все равно ничего. Вот блок скриптов, который я пытаюсь использовать:
<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>
Из того, что я прочитал, я чувствую, что я близко, но я просто не могу положить палец на недостающее звено. Пожалуйста, помогите в ваших типичных хитрых способах ниндзя. ТИА
**** ОБНОВЛЕНИЕ **** Ник настоящий ниндзя. Они должны изобрести новый значок для этого! Его ответ ниже делает свое дело. Поскольку он упоминает, что это 1.4 определенно, но я могу жить с этим. Вот мой окончательный код, который работает для любых ниндзя в обучении (и моя будущая ссылка):
<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 ответов
Обновлено: если вы используете 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)
Это то, что я сделал, и это также работало нормально:
$.ajax('URL', {
myCustomControl: selectBox,
myCustomVariable: 'teste',
data:
{
myData: 1
},
success: function (data, textStats, jqXHR) {
myFunction(data, textStats, jqXHR, this.myCustomControl, this.myCustomVariable);
}
});
Вы можете добавить элементы управления и переменные к параметрам вашего вызова ajax.
Поместите это в ваши параметры $.ajax.
invokedata: {
data1: "yourdata",
data2: "moredata"
}
В функции успеха используйте это так
this.invokedata.data1;
this.invokedata.data2;
Ваш вызов $.ajax и функция успеха также должны быть частью одного и того же объекта. Поместите свои функции в объект и определите их так
function myObject {
var getImage = function(..) { }
var loadImagesInSelect = function(..) { }
}
this
выходит за рамки
Просто, чтобы вы (или кто-либо еще) понимали (с) 1, причину, по которой this
был неопределен в loadImagesInSelect()
в вашем первоначальном примере это было потому, что эта функция находилась в другой области видимости, и области видимости не "каскадные", как это 2.
Когда вы указали "контекст" selectBox
в вашем вызове AJAX он устанавливает контекст (this
) для функций, заданных для "успеха" и "ошибки". (Так уж получилось, что они оба были анонимными функциями.) this
определяется в обеих из этих функций, как значение selectBox
, Теперь, в функции, переданной в "успех", вы вызываете 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()
избыточен
Использование $.proxy()
в вашем обновленном коде избыточно. Ты используешь $.proxy()
получить this
к функции, которая раньше называлась loadImagesInSelect()
, но вы все равно перевели эту функцию в "успех" (вместо того, чтобы вызывать ее из "успеха"). Он уже имеет доступ к значению this
определяется "контекстом".
Вы можете удалить $.proxy()
обертка вокруг вашей "успеха" функции в вашем обновленном коде, и она все равно будет работать.
Я знаю, что прошло много лет с тех пор, как ты задавал свой вопрос, но я надеюсь, что это поможет.
- Я надеюсь, что это не кажется снисходительным; не судьба.
- По крайней мере, не когда вы вызываете функцию, а не с контекстом. Если вы определяете функцию внутри функции (т.е. замыкание), то любые переменные во внешней функции будут доступны во внутренней функции. Тем не менее, контекст внешней функции (
this
переменная) все еще не доступна во внутренней функции. - замещать
undefined
сwindow
для нестрогого режима. - Или родной
Function.prototype.bind()
в ECMAScript 5.
Вы можете использовать атрибут 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);
});