调用e.preventDefault()后提交表单

时间:2014-03-12 21:07:05

标签: javascript jquery html forms

我在这里做了一些简单的表格验证,并且陷入了一个非常基本的问题。我有5个字段对用于名称和主菜(用于晚餐注册)。用户可以输入1-5对,但如果存在名称,则必须选择主菜。代码:

http://jsfiddle.net/eecTN/1/

<form>
    Name: <input name="atendeename[]">
    Entree: <input name="entree[]"><br>
    Name: <input name="atendeename[]">
    Entree: <input name="entree[]"><br>
    Name: <input name="atendeename[]">
    Entree: <input name="entree[]"><br>
    Name: <input name="atendeename[]">
    Entree: <input name="entree[]"><br>
    Name: <input name="atendeename[]">
    Entree: <input name="entree[]"><br>
    <input type="submit" value="Submit">
</form>
// Prevent form submit if any entrees are missing
$('form').submit(function(e){

    e.preventDefault();

    // Cycle through each Attendee Name
    $('[name="atendeename[]"]', this).each(function(index, el){

        // If there is a value
        if ($(el).val()) {

            // Find adjacent entree input
            var entree = $(el).next('input');

            // If entree is empty, don't submit form
            if ( ! entree.val()) {
                alert('Please select an entree');
                entree.focus();
                return false;
            }
        }
    });

    $('form').unbind('submit').submit();

});

错误消息正在运行,但每次都会提交表单。我知道这条线路出了问题:

$('form').unbind('submit').submit();

......但我不确定自己需要做什么。

11 个答案:

答案 0 :(得分:69)

最简单的解决方案是调用e.preventDefault(),除非验证确实失败。在内部if语句中移动该行,并使用.unbind().submit()删除该函数的最后一行。

答案 1 :(得分:27)

使用本机element.submit()绕过jQuery处理程序中的preventDefault,并注意你的return语句只返回每个循环,它不会从事件处理程序返回

$('form').submit(function(e){
    e.preventDefault();

    var valid = true;

    $('[name="atendeename[]"]', this).each(function(index, el){

        if ( $(el).val() ) {
            var entree = $(el).next('input');

            if ( ! entree.val()) {
                entree.focus();
                valid = false;
            }
        }
    });

    if (valid) this.submit();

});

答案 2 :(得分:13)

问题在于,即使您看到错误,您的return false也会影响.each()方法的回调...因此,即使出现错误,您也会遇到错误

$('form').unbind('submit').submit();

并提交表格。

您应该创建一个变量validated,例如,并将其设置为true。然后,在回调中,而不是return false,设置validated = false

...最后

if (validated) $('form').unbind('submit').submit();

这样,只有没有错误才会提交表格。

答案 3 :(得分:5)

$('form').submit(function(e){

    var submitAllow = true;

    // Cycle through each Attendee Name
    $('[name="atendeename[]"]', this).each(function(index, el){

        // If there is a value
        if ($(el).val()) {

            // Find adjacent entree input
            var entree = $(el).next('input');

            // If entree is empty, don't submit form
            if ( ! entree.val()) {
                alert('Please select an entree');
                entree.focus();
                submitAllow = false;
                return false;
            }
        }
    });

    return submitAllow;

});

答案 4 :(得分:2)

很抱歉延迟,但我会尝试制作完美的表格:)

我将添加计数验证步骤,并且每次都检查.val()。检查.length,因为我认为在您的情况下是更好的模式。当然要删除unbind功能。

My jsFiddle

当然源代码:

// Prevent form submit if any entrees are missing
$('form').submit(function(e){

    e.preventDefault();

    var formIsValid = true;

    // Count validation steps
    var validationLoop = 0;

    // Cycle through each Attendee Name
    $('[name="atendeename[]"]', this).each(function(index, el){

        // If there is a value
        if ($(el).val().length > 0) {
            validationLoop++;

            // Find adjacent entree input
            var entree = $(el).next('input');

            var entreeValue = entree.val();

            // If entree is empty, don't submit form
            if (entreeValue.length === 0) {
                alert('Please select an entree');
                entree.focus();
                formIsValid = false;
                return false;
            }

        }

    });

    if (formIsValid && validationLoop > 0) {
        alert("Correct Form");
        return true;
    } else {
        return false;
    }

});

答案 5 :(得分:1)

实际上,这似乎是正确的方法:

$('form').submit(function(e){

    //prevent default
    e.preventDefault();

    //do something here

    //continue submitting
    e.currentTarget.submit();

});

答案 6 :(得分:1)

遇到了同样的问题,在论坛上等都没有找到直接的解决方案。最后,以下解决方案对我来说很完美: 只需在事件处理程序函数中为“提交”事件形式实现以下逻辑即可:

if (txtJuice != "0")
{
    rtfSmetka.AppendText("Juice \t\t\t\t" + txtJuice.Text + Environment.NewLine);
}

那样简单; 注意:当表单'submit'事件的处理程序返回'false'时,表单不会提交到html标记的action属性中指定的URI;直到且除非处理程序返回“ true”;并且所有输入字段都经过验证后,事件处理程序将返回“ true”,并且您的表单将被提交;

还要注意:if()条件内的函数调用基本上是您自己的实现,以确保所有字段都经过验证,因此必须从那里返回“ true”,否则返回“ false”

答案 7 :(得分:1)

$(document).ready(function(){
      $('#myform').on('submit',function(event){
            // block form submit event
            event.preventDefault();

            // Do some stuff here
            ...

            // Continue the form submit
            event.currentTarget.submit();
      });
});

Source

答案 8 :(得分:0)

为什么不绑定提交按钮事件而不是表单本身? 如果你绑定按钮而不是表单本身会更容易和更安全,因为表单将主要提交,除非你将使用preventDefault()

$("#btn-submit").on("click", function (e) {
    var submitAllow = true;
    $('[name="atendeename[]"]', this).each(function(index, el){
        // If there is a value
        if ($(el).val()) {
            // Find adjacent entree input
            var entree = $(el).next('input');

            // If entree is empty, don't submit form
            if ( ! entree.val()) {
                alert('Please select an entree');
                entree.focus();
                submitAllow = false;
                return false;
            }
        }
    });
    if (submitAllow) {
        $("#form-attendee").submit();
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="form-attendee">
    Name: <input name="atendeename[]">
    Entree: <input name="entree[]"><br>
    Name: <input name="atendeename[]">
    Entree: <input name="entree[]"><br>
    Name: <input name="atendeename[]">
    Entree: <input name="entree[]"><br>
    Name: <input name="atendeename[]">
    Entree: <input name="entree[]"><br>
    Name: <input name="atendeename[]">
    Entree: <input name="entree[]"><br>
    <button type="button" id="btn-submit">Submit<button>
</form>

答案 9 :(得分:0)

就我而言,有一场竞赛,因为我需要 ajax 响应来填充隐藏字段并在填充后发送表单。我通过将 e.preventDefault() 放入条件来修复它。

var all_is_done=false;
$("form").submit(function(e){
  if(all_is_done==false){
   e.preventDefault();
   do_the_stuff();
  }
});
function do_the_stuf(){
  //do stuff
  all_is_done=true;
  $("form").submit();
}

答案 10 :(得分:-1)

绑定到按钮不会解决按下按钮之外的提交,例如按回车