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

Wes*_*rch 57 html javascript forms jquery

我在这里做了一些简单的表单验证,并且陷入了一个非常基本的问题.我有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>
Run Code Online (Sandbox Code Playgroud)
// 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();

});
Run Code Online (Sandbox Code Playgroud)

错误消息正在运行,但它每次都在提交表单.我知道这条线有问题:

$('form').unbind('submit').submit();
Run Code Online (Sandbox Code Playgroud)

......但我不确定我需要做什么.

nnn*_*nnn 73

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

  • 出于某种原因,我认为我需要在其他任何事情之前调用`e.preventDefault()`或冒某种竞争条件.谢谢你的启示. (11认同)
  • 不,整个功能将在默认操作继续之前完成(或者如果您已取消默认操作则不会继续).如果您知道自己从未想过特定事件的默认操作,那么将它作为显而易见的第一行是有意义的(例如,如果您想通过Ajax而不是表单提交或单击提交数据)触发JS而不是标准导航的链接上的处理程序.否则,将它放在条件逻辑中就可以了. (2认同)
  • @JamesNZ - 我很确定它是安全的。在严重基于 Ajax 的站点竞争条件中,如果在响应返回之前发出多个 Ajax 请求,则可能会出现问题,因为无法保证响应会以任何特定顺序返回 - 但即便如此,您仍然不需要` e.preventDefault()` 作为第一行,因为当前的同步代码块*将*在任何 Ajax 回调被触发之前完成。也就是说,JS 将*不* 中断当前运行的函数来调用 Ajax 回调 - 或者第二个事件处理程序或超时回调或其他任何东西。 (2认同)

ade*_*neo 33

使用native 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();

});
Run Code Online (Sandbox Code Playgroud)


Osc*_*Paz 14

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

$('form').unbind('submit').submit();
Run Code Online (Sandbox Code Playgroud)

并提交表格.

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

最后...

if (validated) $('form').unbind('submit').submit();
Run Code Online (Sandbox Code Playgroud)

这样,只有在没有错误的情况下才会提交表单.


小智 8

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

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

    //prevent default
    e.preventDefault();

    //do something here

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

});
Run Code Online (Sandbox Code Playgroud)


fal*_*sky 6

$('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;

});
Run Code Online (Sandbox Code Playgroud)