IE9在302之后重新提交表单-可能是由于递归setTimeout()调用

IE9 resubmitting form after 302 - possibly due to recursive setTimeout() call

本文关键字:于递归 调用 setTimeout 递归 表单 之后 新提交 IE9 提交      更新时间:2023-09-26

我在IE9 中看到以下内容

  1. Javascript通过.submit()提交表单
  2. 服务器成功返回302
  3. IE在重定向的URL上获取
  4. IE通过.submit()重新提交表单

提交发生在一个函数内部,该函数通过setTimeout递归地调用自己,我认为这可能是罪魁祸首。但从逻辑上讲,我不认为提交会发生两次。功能如下:

function callback() {
    "use strict";
    var poll_timeout, // setting a var in case we need to kill the timeout mid count
        poll_counter = 0, // start a counter
        max_polls = 10; // set a max count
    function doPoll() {
        if (poll_counter < max_polls) { // make sure we're not above the count
            poll_counter++; // increment the counter
            $.post("/someUrl", function (success) {
                // ajax it
                if (success) {
                    $("form#checkout").off('submit', Store.cancel_submit)
                    $('form#checkout').submit();
                } else {
                    // do it again
                    poll_timeout = setTimeout(doPoll,10000);
                }
            });
        }
    }
    doPoll();
}

如果jQuery的$.post$.ajax不同,我对它并不熟悉,但我这样做是为了防止在成功后再次运行poll_timeout:

if (success) {
    clearTimeout(poll_timeout);
    $("form#checkout").off('submit', Store.cancel_submit)
    $('form#checkout').submit();
} else {
    // do it again
    poll_timeout = setTimeout(doPoll,10000);
}