我正在尝试在每个表单元素上附加一个事件侦听器,然后检查它们是否已提交。我不希望表单提交,而是在它之前等待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);
});
});
我得到的问题是它保持事件监听器,所以它基本上运行到无限循环或它不提交表单。我做错了什么?
编辑:对你们所有人来说:为什么?我知道我不应该在表单提交中引入延迟,但这适用于我自己的项目,等待一秒钟我完全没问题。答案 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);
});
});