Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在两次提交之间进行等待_Javascript_Jquery - Fatal编程技术网

Javascript 在两次提交之间进行等待

Javascript 在两次提交之间进行等待,javascript,jquery,Javascript,Jquery,我有一个表单,在提交时执行AJAX操作。就在用户提交表单之后,我想施加5秒的最小等待时间来再发布一次 有什么更好的办法?我制作了这个脚本(虽然不起作用,但我想我的想法就在这里): 最简单、最标准的方法是使用Javascript原生setTimeout方法 var last_action; function ajax_action() { last_action = Date.getTime(); // AJAX STUFF } $("form#submit_under_wall"+a

我有一个表单,在提交时执行AJAX操作。就在用户提交表单之后,我想施加5秒的最小等待时间来再发布一次

有什么更好的办法?我制作了这个脚本(虽然不起作用,但我想我的想法就在这里):


最简单、最标准的方法是使用Javascript原生
setTimeout
方法

var last_action;

function ajax_action() {
  last_action = Date.getTime();
  // AJAX STUFF
}

$("form#submit_under_wall"+array[1]).submit(function(e) {
  e.preventDefault(); // Sexier than 'return false'
  if(last_action != undefined) {
    setTimeout(ajax_action, Date.getTime()-last_action); // Wait for 5s before doing the action 
  } else {
    ajax_action();
  }
});

这不起作用,因为每次提交时都会重置时间戳,您需要将提交时间戳移到函数之外。另外,5应该是5*1000

类似于此(未经测试):


使用
window.setTimeout()

  • 在函数中包装您要执行的操作(例如
    函数foo(){alert('test');}

  • 用5秒延迟调用它
    setTimeout(foo,5000)


  • 如果您正在寻找一种“更好的方法”,那么您真的应该将此应用于服务器端。你在客户端上所做的任何事情都会被用户绕过。他不想以后再提交,他想确保你每5秒只能提交一次。还是不行。假设他们以10倍的速度点击按钮,第一个按钮现在会导致一个ajax操作,接下来的9个按钮会在5秒钟后排队,大约5秒钟后,会有9个ajax操作(而不是相隔5秒钟),你是对的。我再次开始编辑它,然后意识到你的答案是正确的。因此,我将只+1你的。小的改进:如果用户在前5秒内第一次尝试提交,你将强制用户等待。可能发生在复制/粘贴/提交场景中。
    var last_action;
    
    function ajax_action() {
      last_action = Date.getTime();
      // AJAX STUFF
    }
    
    $("form#submit_under_wall"+array[1]).submit(function(e) {
      e.preventDefault(); // Sexier than 'return false'
      if(last_action != undefined) {
        setTimeout(ajax_action, Date.getTime()-last_action); // Wait for 5s before doing the action 
      } else {
        ajax_action();
      }
    });
    
    var submitTime = (new Date()).getTime() - 5000; //let user submit if he clicks within 5s of page load
    $("form#submit_under_wall"+array[1]).submit(function(e) {
        var now = (new Date()).getTime();
        if(now-submitTime > 5000){
             submitTime = (new Date()).getTime();
             //AJAX ACTION             
        } else {
            alert("Wait 5sec between each post.");
        }
        e.preventDefault(); 
    });