2009-10-15 125 views
23

我有这个ajax调用doop.php阿贾克斯jquery成功范围

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

+8

哇哇哇哇哇。 'new'是一个保留字:https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Reserved_Words – 2009-10-15 03:31:48

+3

不要担心新的问题,它在我的代码中被称为别的东西。只是把它叫做新的,以使代码对于你们更容易理解 – Chris 2009-10-15 03:40:25

回答

24

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

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

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

这就是所谓的closure

+0

嗯,很奇怪,我尝试了一些与你所做的非常相似的事情,但是我做了'var saveit = $(this);'没有工作。我现在就试试这个。也不用担心新的问题,它在我的代码中被称为别的东西。 – Chris 2009-10-15 03:42:12

+0

@Chris:re:'new',我想到了很多。 :) – 2009-10-15 03:43:54

+0

@Chris:重新关闭不工作,确保'doop'本身是指预期的'this'。例如,如果你只是调用'doop()','this'就会指向'window'对象。 – 2009-10-15 03:53:13

5

this绑定到执行函数应用到的对象。这可能是一些Ajax响应对象,或者全局对象(window),或别的东西(视$.ajax实施。

我需要进入$之前捕捉到$(本)到一个变量。 ajax调用,然后将它作为参数传递给$ .ajax调用?或者是否需要将它传递给匿名成功函数?如果这样可以解决问题,我可以将它传递给$ .ajax?

你确实需要一种方式定义success函数之前捕捉到的this值。创建一个封闭是做到这一点的方式。你需要d成为一个单独的变量(例如, 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的价值,应该表现为你的预期。

+0

谢谢+1。这与crescentfresh的答案是一样的,它解决了“问题的一部分”..将通过更多故障排除更新问题。 – Chris 2009-10-15 04:20:12

46

您应该使用背景设置为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; 
} 

“这”将转移到成功的范围和预期将采取行动。

+0

你真的不应该使用像'new'这样的保留字作为变量名。 – Tomalak 2012-06-03 18:35:01

+5

+1这应该是被接受的答案。 – Nick 2012-08-31 11:43:48

+0

与尼克同意 - 这是正确的方法。考虑到当单击多个按钮中的一个或其他这样的重复时,如果你有函数“doop”调用,“保存在另一个变量中”方法将不起作用。 – 2012-09-28 20:38:46