Область успеха jQuery Ajax
У меня есть этот вызов ajax для doop.php
.
function doop(){
var old = $(this).siblings('.old').html();
var new = $(this).siblings('.new').val();
$.ajax({
url: 'doop.php',
type: 'POST',
data: 'before=' + old + '&after=' + new,
success: function(resp) {
if(resp == 1) {
$(this).siblings('.old').html(new);
}
}
});
return false;
}
Моя проблема в том, что строка $(this).siblings('.old').html(new);
не выполняет то, что она должна делать.
спасибо..
все полезные комментарии/ответы проголосовали.
Обновление: кажется, что половина проблемы была областью (спасибо за ответы, которые помогли мне уточнить это), но другая половина заключается в том, что я пытаюсь использовать ajax в синхронном манера. Я создал новое сообщение
Ответы
Ответ 1
Прежде всего new
зарезервированное слово. Вам нужно переименовать эту переменную.
Чтобы ответить на ваш вопрос, да, вам нужно сохранить this
в переменной вне обратного вызова успеха и ссылаться на нее внутри вашего кода обработчика успеха:
var that = this;
$.ajax({
// ...
success: function(resp) {
if(resp == 1) {
$(that).siblings('.old').html($new);
}
}
})
Это называется closure.
Ответ 2
Вы должны использовать параметр контекст, как в http://api.jquery.com/jQuery.ajax/
function doop(){
var old = $(this).siblings('.old').html();
var newValue = $(this).siblings('.new').val();
$.ajax({
url: 'doop.php',
type: 'POST',
context: this,
data: 'before=' + old + '&after=' + newValue,
success: function(resp) {
if(resp == 1) {
$(this).siblings('.old').html(newValue);
}
}
});
return false;
}
"this" будет передаваться в область успеха и будет действовать как ожидалось.
Ответ 3
this
привязан к объекту, к которому была применена исполняющая функция. Это может быть какой-то объект ответа AJAX или глобальный объект (window
) или что-то еще (в зависимости от реализации $.ajax
.
Нужно ли записывать $(this) в переменную перед вводом вызова $.ajax, а затем передать ее как параметр в вызов $.ajax? или мне нужно передать его анонимной функции успеха? Если это решит проблему, куда передать ее в $.ajax?
Вам действительно нужен способ захватить значение this
перед определением функции success
. Создание закрытия - это способ сделать это. Вам нужно определить отдельную переменную (например, self
):
function doop() {
var old = $(this).siblings('.old').html();
var new = $(this).siblings('.new').val();
var self = this;
$.ajax({
url: 'doop.php',
type: 'POST',
data: 'before=' + old + '&after=' + new,
success: function(resp) {
if(resp == 1) {
$(self).siblings('.old').html(new);
}
}
});
return false;
}
Функция success
сохранит значение self
при вызове и будет вести себя так, как вы ожидали.