2010-05-24 42 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