【问题标题】:Ajax jquery success scopeAjax jquery 成功范围
【发布时间】:2010-12-06 21:49:12
【问题描述】:

我有这个对doop.php 的ajax 调用。

    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); 行没有做它应该做的事情。

谢谢.. 所有有用的 cmets/answers 都会被投票。

更新:看来问题的一半是范围(感谢帮助我澄清这一点的答案),但另一半是我试图在同步中使用 ajax方式。我创建了一个新帖子

【问题讨论】:

标签: javascript jquery ajax scope


【解决方案1】:

你应该使用http://api.jquery.com/jQuery.ajax/中的context设置

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”将转移到成功范围,并按预期执行。

【讨论】:

  • 你真的不应该使用像new这样的保留字作为变量名。
  • 同意尼克 - 这是正确的方法。考虑到“将其保存在另一个变量中”的方法将不起作用,如果您在单击多个按钮之一或其他类似重复时调用了函数“doop”。
  • +1 比选择的答案灵活得多,在我们的例子中,var 对于很长的项目列表中的每个项目都必须是唯一的,这会增加代码膨胀,这是一些简短的字符并提供更灵活的用例。
【解决方案2】:

首先newa reserved word。您需要重命名该变量。

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

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

这称为closure

【讨论】:

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

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

是否需要在进入 $.ajax 调用之前将 $(this) 捕获到变量中,然后将其作为参数传递给 $.ajax 调用?还是我需要将它传递给匿名成功函数?如果这样可以解决问题,我应该在哪里将它传递给 $.ajax?

在定义success 函数之前,您确实需要一种方法来捕获this 的值。创建闭包是执行此操作的方法。您需要定义一个单独的变量(例如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 的答案相同,它解决了“部分问题”.. 将通过更多故障排除更新问题。
猜你喜欢
  • 2011-11-11
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多