在preventDefault()之后提交延迟表单

时间:2017-09-05 12:44:27

标签: javascript jquery

我正在尝试在每个表单元素上附加一个事件侦听器,然后检查它们是否已提交。我不希望表单提交,而是在它之前等待1秒。表单已提交,我希望console.log()表单中的结果。下面的代码应该有效,但它没有:

$("form").each(function() {
    $(this).on("submit", function(e) {
        e.preventDefault();
        var form = $(this);
        setTimeout(function() {
            form.submit();
        }, 1000);
        var data = $(this).serialize();
        console.log(data);
    });
});

我得到的问题是它保持事件监听器,所以它基本上运行到无限循环或它不提交表单。我做错了什么?

编辑:对你们所有人来说:为什么?我知道我不应该在表单提交中引入延迟,但这适用于我自己的项目,等待一秒钟我完全没问题。

5 个答案:

答案 0 :(得分:2)

问题是<?php $arr =array(array('ID' => 1, 'name' => NULL, 'count' => NULL ), array( 'ID' => 2, 'name' => NULL, 'count' => NULL ), array( 'ID' => 3, 'name' => NULL, 'count' => 4354 ), array( 'ID' => 4, 'name' => 'Alice', 'count' => NULL ), ); function icmp($a, $b){ return $a> $b ? 1 : ($a == $b ? 0 : -1); } function cmp($a,$b){ // $a,$b are reference to first index of array $res = icmp($a['ID'], $b['ID']); if($res == 0){ $res = $a['name']==NULL ? 1: ($b['name'] == NULL ? -1 : strcmp($a["name"], $b["name"])); if($res==0) $res = icmp($a['count'], $b['count']); } return $res; } usort($arr, "cmp"); var_dump($arr); 是jQuery对象,因此form运行jQuery提交处理程序,并导致无限循环。您想要调用浏览器的本机提交代码。这样做:

form.submit()

这将var form = $(this).get(0); 设置为DOM元素而不是jQuery对象,form将提交表单而不通过jQuery处理程序。

答案 1 :(得分:0)

我相信这会奏效。表单提交延迟一秒。提交表单后,您必须删除超时。

$("form").each(function() {

    $(this).on("submit", function(e) {
        e.preventDefault();
        var form = $(this);
        var data = $(this).serialize();
        setTimeout(function() {
          console.log(data);
          form.submit();
        }, 1000);
    });

});

答案 2 :(得分:0)

var submitted = false;
$("form").each(function() {
    $(this).on("submit", function(e) {
        if(!submitted) {
            e.preventDefault();
            setTimeout(() => {
                $(this).submit();
            }, 1000);
            var data = $(this).serialize();
            console.log(data);
            submitted = true;
        }
    });
});

这样可行。我希望有一个更好的解决方案,但是如果它有效则可行。

答案 3 :(得分:-1)

$("form").each(function() {
    $(this).on("submit", function(e) {
        if(!$(this).hasClass("submitted")) {
            e.preventDefault();
            var form = $(this);
            setTimeout(function() {
                form.submit();
            }, 1000);
            var data = $(this).serialize();
            console.log(data);
            $(this).addClass("submitted");
        }
    });
});

如果你真的需要,你可以尝试这样的事情。

答案 4 :(得分:-1)

     bool someflag=true    
     $("form").each(function() {
        $(this).on("submit", function(e) {
        if (someflag){        
                e.preventDefault();
                someflag=false;
        }
                var form = $(this);
                setTimeout(function() {
                    form.submit();
                }, 1000);
                var data = $(this).serialize();
                console.log(data);
            });
        });