0

我有这个简单的表单和验证,一切都很好,除了“this”指向,好吧,我不知道是什么:

$('#contact').validator().submit(function(e){
        e.preventDefault();
        $.ajax({
          type: "POST",
          url: this.action,
          data: { 
            mail: jQuery('input[name="mail"]').val(), 
            message: jQuery('textarea[name="message"]').val(),
          success: function(){
            $(this).hide();
          }
        }); 
    });

我希望这段代码在成功时隐藏#contact,但这永远不会发生。

我试过了alert(this),但我得到了[object Object],同样的事情发生在我做console.log( $(this) )的时候(只有对象旁边有+,当我点击+时,我看到除了这个元素的类/id之外的各种数据:()。有什么想法吗?我的代码有问题吗?

4

2 回答 2

1

你失去了上下文。在submit功能#contact元素中是上下文。在 ajax 回调中,ajax 设置是上下文。

来自 jQuery 文档:

所有回调中的 this 引用是设置中传递给 $.ajax 的 context 选项中的对象;如果未指定上下文,则这是对 Ajax 设置本身的引用。

$('#contact').validator().submit(function (e) {
  e.preventDefault();

  var self = this;

  $.ajax({
    type: "POST",
    url: this.action,
    data: {
      mail: jQuery('input[name="mail"]').val(),
      message: jQuery('textarea[name="message"]').val(),
      success: function () {
        $(self).hide();
      }
    });
  });
});
于 2013-02-24T04:38:57.700 回答
1

thissuccess方法的上下文中不引用单击的元素,您应该缓存该元素:

$('#contact').validator().submit(function(e){
        e.preventDefault();
        var $this = $(this); // cache the object
        $.ajax({
          type: "POST",
          url: this.action,
          data: { 
            mail: jQuery('input[name="mail"]').val(), 
            message: jQuery('textarea[name="message"]').val()
          }, // missing }
          success: function(){
            $this.hide();
          }
        }); 
});
于 2013-02-24T04:41:59.863 回答