Ajax jquery 成功范围

IT技术 javascript jquery ajax scope
2021-02-23 02:02:52

我有一个 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。我创建了一个新帖子

3个回答

您应该使用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”将转移到成功范围并按预期运行。

+1 比选定的答案灵活得多,在我们的例子中,很长的项目列表中的每个项目的 var 必须是唯一的,增加了代码膨胀,这是几个短字符,并提供了更灵活的用例.
2021-04-17 02:02:52
同意尼克 - 这是正确的方法。考虑到“将其保存在另一个变量中”方法将不起作用,如果您在单击多个按钮之一时调用了函数“doop”或其他一些此类重复。
2021-04-22 02:02:52
你真的不应该使用像new变量名这样的保留字
2021-05-12 02:02:52

首先new一个保留字您需要重命名该变量。

要回答您的问题,是的,您需要保存this在成功回调之外的变量中,并在您的成功处理程序代码中引用它:

var that = this;
$.ajax({
    // ...
    success: function(resp) {
        if(resp == 1) {
            $(that).siblings('.old').html($new);
        }
    }
})

这称为闭包

好的,关闭后,我可以正确定位这个/那个(我用 show/hide 测试了它,我知道它定位的是正确的东西)。但是,它没有更新 html.. 我正在做一些故障排除并将更新我上面的答案,请有机会时回来查看,谢谢。
2021-04-17 02:02:52
@Chris: re: new,我想了很多。:)
2021-04-21 02:02:52
现在我已经完成了我的故障排除,我得出的结论是问题的后半部分是我应该使用同步 ajax。不是异步的。更新我上面的问题并发布一个新问题。
2021-04-26 02:02:52
嗯,很奇怪,我尝试了与您所做的非常相似的事情,但var saveit = $(this);没有奏效。我现在就试试这个.. 也不要担心 new,它在我的代码中被称为其他东西。
2021-05-12 02:02:52
@Chris:重新关闭不起作用,请确保doop它本身指的是预期的this. doop()例如,如果您只是调用this则只会指向该window对象。
2021-05-12 02:02:52

this绑定到应用了执行函数的对象。这可能是一些 AJAX 响应对象,或全局对象 ( window),或其他东西(取决于$.ajax.

我是否需要在进入 $.ajax 调用之前将 $(this) 捕获到一个变量中,然后将其作为参数传递给 $.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调用时的值,并且应按您的预期运行。

谢谢+1。这与 crescentfresh 的答案相同,它解决了“部分问题”.. 将通过更多故障排除更新问题。
2021-04-18 02:02:52