我有一个简单的例子,我发现onsubmit需要立即返回值。我有一个暂停5秒的函数并等到它完成然后返回布尔值以模拟其他javascript处理操作。但是,即使在我的函数设法返回任何值之前,页面表单提交仍会触发。那么我该怎么做呢,在我的情况下会在JS帮助中使用回调吗?
<html>
<body>
<form action="test.html" onsubmit="return testing();">
<button type="submit"> hello world </button>
</form>
</body>
<script>
function testing()
{
var newState = -1;
setTimeout(function() {
if (newState == -1) {
alert('VIDEO HAS STOPPED');
output = "newText";
console.log("AFTER 5 Sec: " + output);
return false;
}
}, 5000);
//return false;
}
</script>
</html>
答案 0 :(得分:2)
除非'功能完成',否则不能提交表单。
超时将调用不同的函数,该函数在将来的某个时刻独立运行;只需根据进程的标志/状态禁用默认的提交操作。
我已将这些功能分开,因此更清晰。
var state; // undefined, 'waiting', 'done'
function waitForVideo () {
alert('VIDEO HAS STOPPED');
console.log("AFTER 5 Sec: " + output);
// call submit again (or do whatever)
state = 'done';
document.forms[0].submit();
}
function testing()
{
if (!state)
{
state = 'waiting';
// function queued for timeout - not run immediately
setTimeout(waitForVideo, 5000);
}
if (state === 'waiting') {
// don't submit - timeout not done
return false;
}
}
答案 1 :(得分:1)
一个选项是在按钮单击本身中调用testing()。您可以在超时功能中手动调用submit()。但是在调用testing()之后一定要返回false。
例如:
<form id="myForm" action="test.html">
<button type="submit" onclick="testing(); return false;"> hello world </button>
</form>
<script type="javascript">
function testing()
{
var newState = -1;
setTimeout(function() {
if (newState == -1) {
alert('VIDEO HAS STOPPED');
output = "newText";
console.log("AFTER 5 Sec: " + output);
document.getElementById("myForm").submit();
return false;
}
}, 5000);
//return false;
}
</script>
顺便说一下,似乎不需要newState变量。