2009-10-15 122 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