$(this)对象在jquery post()后变为未定义

在我的网站的登录页面上,我有两个相同的登录表单。 一个在页面的主体中,第二个被加载到标题中的Login链接的jquery对话框中。 我已经删除了所有相同的ID并使用了类。

我想要做的是:在用户单击对话框中的提交后,我试图将错误消息放入正确的DIV中,但是在jquery post()或ajax调用之后我得到$(this)未定义。

 $('.login-submit').live('click', function(){ alert($(this).attr('class')); // THIS WORKS var form = $(this).parent('form').get(0); var values = $(this).parent('form').serialize(); $.post('/users/login',values,function(data){ if(!data['success']) { alert($(this).attr('class')); // THIS SAYS UNDEFINED // TRYING TO DO THIS $(this).siblings('.form-error').html(data['error']); } },'json'); }); 

这是HTML:

  

回调在不同的上下文中执行。

您需要将外部保存在变量中,以便可以在内部函数中使用它。

在您的示例中,这是指匿名函数。 试试这个:

 $('.login-submit').live('click', function(){ var that = this; alert($(this).attr('class')); // THIS WORKS var form = $(this).parent('form').get(0); var values = $(this).parent('form').serialize(); $.post('/users/login',values,function(data){ if(!data['success']) { alert($(that).attr('class')); // THIS SAYS UNDEFINED // TRYING TO DO THIS $(that).siblings('.form-error').html(data['error']); } },'json'); }); 

然后,您的函数将在其执行范围内具有此function,但它将存储在该变量中。

这是因为Javascript闭包 – 在每个新函数的范围内重新定义了“this”。

 $('.login-submit').live('click', function(){ alert($(this).attr('class')); // THIS WORKS var form = $(this).parent('form').get(0); var values = $(this).parent('form').serialize(); var me = $(this); $.post('/users/login',values,function(data){ if(!data['success']) { me.siblings('.form-error').html(data['error']); } }, 'json'); });