有没有办法在表单中提交动作之前暂停或等待函数完成

时间:2015-06-01 01:52:15

标签: javascript html5 form-submit

我有一个简单的例子,我发现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>

2 个答案:

答案 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变量。