2011-01-12 42 views
1

我有这样的JS代码Rails 3的jQuery验证插件

$(".new_milestone").validate({ 
    submitHandler: function(form) { 
    $(form).submitWithAjax(); 
    }, 
    errorPlacement: function(error, element) { 
     error.insertBefore(element); 
    } 
    }); 

它所有作品,errorPlacement和submitWithAjax功能。但是,当我第二次发布表单而不重新加载页面时,表单会发布两次。下次3次,依此类推。

当我这样做

$(".new_milestone").validate({ 
      errorPlacement: function(error, element) { 
       error.insertBefore(element); 
      } 
      }); 
$(".new_milestone").submitWithAjax(); 

它的工作原理,但它确实阿贾克斯后即使窗体是无效的。

的submitWithAjax功能看起来像这样(感谢瑞安·贝茨)

jQuery.fn.submitWithAjax = function() { 
    this.submit(function() { 

    $.post(this.action, $(this).serialize(), null, "script"); 
    $('.spinning').show(); 
    $("#dialog_form").dialog("close") 
    return false; 
    }) 
    return this; 
}; 

上制止这一行为的任何想法?

回答

1

发生这种情况,因为你的ssubmitWithAjax功能不* *实际提交(触发事件)时,它附加一个提交处理程序为当submit发生(其中正常行为做)......因为你”再在提交情况调用它,只是删除处理的包装,实际上提出,像这样:

jQuery.fn.submitWithAjax = function() { 
    $.post(this.attr("action"), this.serialize(), null, "script"); 
    $('.spinning').show(); 
    $("#dialog_form").dialog("close") 
    return false; 
}; 

注意.attr("action")变化,因为this不是一个jQuery对象,而不是<form> DOM元素,因为它是直接在插入。


在您以前安装的每个时间额外submit处理程序,这就是为什么你会得到1,2,3 ....提交,通过只调用你想要的代码提交,这不会发生,因为在submitHandler之内是继续并提交的有效位置。

另外,$.post()的回调函数是可选的,因此您可以忽略null,,它会正常运行。

+0

谢谢!你有没有使用rails的经验?删除提交处理程序搞乱了轨道的POST路线。是否有任何方式使用验证功能,而不是“在提交情况下” –

+0

@Andreas - 如果验证结束,'submitHandler'函数只会作为'

'上'submit'事件的一部分被调用。你是否在你的答案中使用了我的代码以上的* first *'.validate()'版本? –

+0

是的,我正在使用第一个。我想我可以尝试没有submitHandler函数。也许一些有效的()函数if语句? –