【问题标题】:setTimeout only looping once, not submitting form?setTimeout 只循环一次,不提交表单?
【发布时间】:2014-04-14 18:43:32
【问题描述】:

我试图帮助某人使用 jQuery 提交表单。他正在提交,并试图将一些文本输出到表单中。但是因为提交;他的脚本在显示所有内容之前就停止了。我能够在提交之前制作一个脚本来显示他的文本,但我想获得更多技术,并让它等待提交,以便能够首先阅读响应。但是,我的setTimeout() 没有循环,并且在preventDefault() 之后表单不会提交关于问题是什么的任何想法?

JSFIDDLE(原破Fiddle

当前测试代码。我意识到它比它应该的要长得多,但是我现在已经用不同的方法将这段代码分解了 5 次,这是最基本的并向我展示了所有步骤......但什么也没有。

主要问题是它永远不会进入条件if ( run === 1 ) {,就好像 setTimeout 甚至没有循环一次一样。

我还可以在使用按钮时让脚本运行,而不是像 the example here

这样提交按钮

更新:代码已修改,现在按原样在 X 秒后发送提交。

 var formElm = $('#replyform');
     positive = $('input[value="Positive"]'),
     negative = $('input[value="Negative"]'),
     response = $('#txt1'),
     run = 0,
     submitnum = 0;

positive.click(function(e)  {
    e.preventDefault();
    submitnum = 1;
    setInterval(submits, 1000);
});

negative.click(function(e) {
     e.preventDefault();
     submitnum = 2;
     setInterval(submits, 1000);

});

function submits() {
    if ( submitnum === 1) {
        submitForm(positive);
    } else if ( submitnum === 2 ) {
        submitForm(negative);
    }
}


function submitForm (e) {
    response.val(e.attr('name') + ' was clicked.');
    if ( run === 1 ) {
        alert('About to submit!');
        e.get(0).form.submit();
    }
    run++
    alert(run);
}

如果您对工作压缩代码感兴趣:

这依赖于为按钮设置的类名,以及作为按钮的类型,而不是提交。

$(".button").click(function() {
    var buttonName = $(this).attr('name'),
    elm = $(this);
    $('#txt1').val( buttonName + ' was clicked.' ); // Add response
    setTimeout(function(){               
         elm.get(0).form.submit(); // Submit form           
    }, 5000); // After 5 seconds
 });

【问题讨论】:

  • 看起来超时调用的函数没有新的setTimeout()setTimeout()在延迟一次后执行一个函数,如果你需要一个“循环”,你可能需要使用setInterval()
  • @Teemu 谢谢,这完美地完成了循环,但仍然没有提交表单。我添加了e.form.submit(),它抛出了一个错误,如下所示。我需要它来发送点击按钮的值,如果我提交正确的主表单就不会出现这种情况?

标签: javascript jquery forms submit settimeout


【解决方案1】:

尝试使用

function submitForm (e) {
    response.val(e.attr('name') + ' was clicked.');
    if ( run === 1 ) {
        alert('About to submit!');
        e.get(0).form.submit();
    }
    run++
    alert(run);
}

http://jsfiddle.net/ZUUs7/11/

【讨论】:

  • 一个主要问题是它永远不会进入那个条件run === 1,就好像超时没有循环一样。
  • 另外添加的.form. 会抛出一个:Uncaught TypeError: Cannot read property 'submit' of undefined,其中 as without 不会抛出错误,但不会提交。
  • 我犯了一个错误。因为 e 是 jQuery 对象,你应该使用 e.get(0).form.submit()
  • 它确实以这种方式工作,但有趣的是,它没有时间提醒它即将提交。或事件整数警报。
  • 点击提交按钮后可以取消真实提交表单吗?
【解决方案2】:

使用$.post 提交表单。

这样您可以附加一个成功函数,该函数在表单提交成功时运行。

演示:http://jsfiddle.net/ZUUs7/27/

【讨论】:

  • 这里使用的方法会把用户带到别处,让 JS 在 post call 之后发送它们是多余的。
  • 预期的行为是将用户带到别处?因为ajax post调用不会这样做。
  • 这就是为什么我们不使用 ajax 或 post...?如示例代码所示,这是对另一个页面的基本提交。
  • 哦,我的错。所以现在一切正常,只是警报没有出现?
  • 现在一切都很好。由于循环,我的浏览器禁用了警报。
猜你喜欢
  • 2015-07-12
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多