2010-05-24 39 views
1

我現在有類似這樣的代碼形式:jQuery的:如何處理「這個」在AJAX回調

$('#some-form') 
    .submit(function() 
    { 
     // Make sure we are not already busy 
     if($(this).data('busy')) 
      return false; 
     $(this).data('busy', true); 

     // Do post 
     $.post("some/url", $(this).serialize(), function(data) 
     { 
      if(data.success) // Success is a boolean I set in the result on the server 
      { 
       // Deal with data 
      } 
      else 
      { 
       // Display error 
      } 

      $('#some-form') 
       .removeData('busy'); 
     }); 
     return false; 
    }); 

我的問題是,我想以某種方式刪除需要知道表單ID在回調後。在最後,我從表格中刪除busy數據,我想不知怎麼的沒有硬編碼。有什麼辦法可以做到這一點?有什麼方法可以將this中的任何內容交給回調函數?由於我現在知道id,所以我可以通過做我已經做的事來解決它,但是我想知道如何不依賴於瞭解id,因爲我經常沒有id。 (例如,如果我在表中的每一行都有一個鏈接,並且所有行都具有相同的點擊處理程序,則

回答

2

在創建回調之前設置值爲「this」的變量 然後在回調函數。

var form = this; 
$.post("some/url", $(this).serialize(), function(data) { 
     $(form).removeData('busy'); 
} 

這樣一來,與表單變量將可在回調中。 當你聲明一個函數,該函數將有機會獲得所有的變量在同一範圍內,即使它被稱爲之後聲明的功能已返回。

您可以閱讀關於關閉的詳細信息如下:http://www.jibbering.com/faq/notes/closures/

+0

似乎很好地工作! – Svish 2010-05-24 08:34:31

+0

很高興聽到! :) – baloo 2010-05-24 09:39:50

0

保留對錶單的引用。

var form = $("form").submit(function() 
{ 
    // do ajax call here, referencencing the "form" variable 

    return false; // return false to prevent default behavior 
}); 

一般來說,你只會有一個表單元素來處理。所以不需要在提交函數中創建引用,將this包裝在jQuery對象中。

這是你修改後的代碼:

var form = $("#some-form").submit(function() 
{ 
    if(form.data("busy")) return false; 

    form.data("busy", true); 

    $.post("some/url", form.serialize(), function (data) 
    { 
     if (data.success) 
     { 
     } 
     else 
     { 
     } 

     form.removeData("busy"); 
    }); 

    return false; 
}); 
+0

在genereal我需要這個比形式,但其他的東西。所以我不想引用它,因爲它會很多,它們會被刪除並添加等等。 – Svish 2010-05-24 08:33:30

0

使用綁定

$('#some-form') 
.submit(function() 
{ 
    // Make sure we are not already busy 
    if($(this).data('busy')) 
     return false; 
    $(this).data('busy', true); 

    // Do post 
    $.post("some/url", $(this).serialize(), function(data) 
    { 
     if(data.success) // Success is a boolean I set in the result on the server 
     { 
      // Deal with data 
     } 
     else 
     { 
      // Display error 
     } 


     $(this).removeData('busy'); 

    }.bind(this)); //Here 
    return false; 
}); 

你可以找到關於JavaScript的範圍intresting文章: http://www.digital-web.com/articles/scope_in_javascript/ 它只是谷歌

+0

有趣。當我嘗試這個時,我得到一個錯誤,說綁定不是一個函數,雖然... – Svish 2010-05-24 10:17:37

+0

@mathk:我認爲你與MooTools的bind()函數混淆。 jQuery中存在bind()函數,但它不具有相同的含義:它用於附加事件。 – mexique1 2010-05-24 20:43:56

+0

實際上我很困惑Prototype庫中的bind()。抱歉 – mathk 2010-05-26 13:58:44

相關問題