【问题标题】:submitHandler is not triggered although it is validsubmitHandler 虽然有效但未触发
【发布时间】:2013-10-15 01:21:28
【问题描述】:

AJAXified commenting system 所以当点击Post Comment 按钮时,会进行ajax 调用而不是原始表单提交。感谢我的另一个问题.submit doesn't work if the bind object was refreshed by ajax,即使刷新提交按钮,它现在也可以工作。

现在我想在提交之前验证表单,但我无法让它工作。即使表单有效,也不会调用 submitHandler 选项。 alert( "Valid: " + commentform.valid() ); 被触发,并且在执行原始提交后不是 ajax 的。

提交表单的javascript看起来像

jQuery(document).ready(function($){
        $('#content_container').on("submit","#commentform",function(){
                var commentform=$('#commentform'); // find the comment form

                console.log('Post Comment button was clicked');     


var validator = $("#commentform").validate({ 
    onsubmit: false,
    rules: { 
        author: "required", 
        email: { required: true, email: true }, 
        url: { url: true    }, 
        comment: "required" 
    }, 
    messages: { 
        author: "Please enter your name",   
        email: { required: "Please enter an email address", 
        email: "Please enter a valid email address" }, 
        url: "Please enter a valid URL e.g. http://www.mysite.com", 
        comment: "Please include your comment" 
    } ,

    submitHandler: function(form) {  // The jQuery.validate plugin will invoke the submit handler if the validation has passed.
            alert( "Valid (submitHandler): " + form.valid() );
            console.log("before exit");
            return;
            console.log("after exit");
        },
    invalidHandler: function(event, validator) {
            alert( "Valid (invalidHandler): " + form.valid() );
            console.log("before exit");
            return;
            console.log("after exit");
        }
});
alert( "Valid: " + commentform.valid() );
return;

        $.ajax({
            type: 'post',
            url: formurl,
            data: formdata,

有人可以建议如何在验证后进行 ajax 调用以提交表单吗?

【问题讨论】:

  • 摆脱你的.on('submit')处理程序。由于插件使用其submitHandler 函数捕获并处理提交事件,因此不需要它。
  • @Sparky:完美,但如果我通过 ajax 刷新页面,单击“发表评论”按钮不会触发验证,而是原始提交。我需要以某种方式保留指向$("#commentform").validate({ 表单的链接,即使该对象是通过 ajax 刷新的。这就是我在另一个问题stackoverflow.com/questions/19343052/… 中提到的内容
  • 你的评论对我来说没有意义。如果您使用的是 Ajax,则不会有页面刷新。
  • 好的,如果您阅读其他问题可能会更有意义。我有一个页面,我在 ajax 调用上刷新内容(包括提交表单)。当我摆脱整行 $('#content_container').on("submit","#commentform",function(){ 时,验证在第一次加载页面时起作用。然后我为表单所在的#content_container 加载新的html,然后如果我单击提交表单按钮,则不会触发验证。
  • 请注意您使用的标签及其描述。 validator 标签与这个问题无关。它适用于“代码验证工具”。已编辑。谢谢。

标签: forms jquery jquery-validate


【解决方案1】:

在这种情况下,你可以试试这个:

    jQuery(document).ready(function($){
         $('#content_container').on("submit","#commentform",function(){
             var commentform=$('#commentform'); // find the comment form

             console.log('Post Comment button was clicked');     


     var validator = $("#commentform").validate({ 
        onsubmit: false,
        rules: { 
            author: "required", 
            email: { required: true, email: true }, 
            url: { url: true    }, 
            comment: "required" 
        }, 
        messages: { 
            author: "Please enter your name",   
            email: { required: "Please enter an email address", 
            email: "Please enter a valid email address" }, 
            url: "Please enter a valid URL e.g. http://www.mysite.com", 
            comment: "Please include your comment" 
        } 
    });
    if (commentform.valid()){
        //Your ajax to post the form
        $.ajax({
                type: 'post',
                url: formurl,
                data: formdata,
    }
    else{
       //form is not valid.
    }
    return false;// stop the form submission and refresh the page.
  });

});

如果您手动验证表单以发送 ajax 请求,则不需要 submitHandlerinvalidHandler

这可行,但我建议您考虑一下您当前的设计,看看是否可以避免用新表单删除旧表单,并且每次都必须重新绑定 .validate()

【讨论】:

  • 我在发布我的问题之前尝试过,但我没有使用return false,只使用return,这就是它不起作用的原因。你能解释一下区别吗?谢谢
  • @Radek:浏览器检查处理程序的返回值。如果返回值为 false,浏览器将停止您的元素的默认行为(在您的情况下是表单提交)并停止事件传播。 return; 是一个不同的场景,调用它时,你只是退出当前函数,但不返回任何值。
  • 那么只有return;只是退出当前函数不返回任何值意味着继续进行标准表单提交?
  • @Radek: return; 退出当前函数返回undefined(无值)给调用函数。这是一个问题,因为falseundefined 是不同的。是的,浏览器会提交表单。
  • 完美,非常感谢您的解释。现在一切都清楚了。
猜你喜欢
  • 2017-10-23
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 2017-09-02
  • 2021-12-04
相关资源
最近更新 更多