Подтвердить что ты не робот

Область успеха 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 в синхронном манера. Я создал новое сообщение

4b9b3361

Ответ 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 при вызове и будет вести себя так, как вы ожидали.