0

我有以下尝试在连接断开时重新加载:

setInterval(window.location.reload(), 1000);

我对此的担心是它可能会永远持续下去,ddos'ing 我的应用程序。

如何在放弃和打破之前更新上述内容以尝试最多 20 次?

谢谢

4

3 回答 3

2

这让我觉得很脏,但是您可以在每次刷新时更新/提取窗口哈希:

function hack () {
  var last = parseInt(location.hash.slice(1));
  if (last < 20) {
    window.location.hash = last + 1;
    window.location.reload();
  }
}

window.location.hash = 0;
setTimeout(hack, 1000);
于 2012-04-17T00:06:14.673 回答
1

您需要从一个页面加载到下一个页面保持一些计数器状态,这样您就可以知道何时完成了 20 次重新加载。您的选择是:

  1. 哈希值
  2. 查询参数
  3. cookie 值
  4. 存储在本地存储中的东西

如果您不需要此值仅在此页面的重新加载后持续存在,那么选项 1) 和 2) 会更好,因为它们仅在您需要时持续存在。哈希值不会发送到您的服务器,但可能会干扰哈希值的其他用途。查询参数将被发送到服务器,但任何合理的服务器都会忽略它不知道的查询值,并且不会干扰其他任何事情。我可能会选择一个查询参数,并且实际上已经使用了一个参数来避免在我的某些代码中出现无限重定向循环。您可以像这样实现选项 2):

function checkAutoReload() {
    var currentCnt = 0;
    var re = /(\?|&)(reloadCnt=)(\d+)/;
    var param = window.location.search.match(re), newURL;
    if (param) {
        currentCnt = parseInt(param[3], 10);
        newURL = window.location.href.replace(re, "$1$2" + (currentCnt + 1))
    } else {
        newURL = window.location.href;
        newURL += window.location.search ? "&" : "?";
        newURL += "reloadCnt=1";
    }
    if (currentCnt < 20) {
        window.location.replace(newURL);
    }
}

setTimeout(checkAutoReload, 1000);

请注意,不需要 a,setInterval()因为给定页面的代码仅在重新加载或发现已完成重新加载之前运行一次。

于 2012-04-17T00:25:23.697 回答
0

将 reloadCount 存储在 localStorage

MDN DOM 存储

    var maxReload = 20;
    var reloadPage = function() {
        if (typeof a !== "undefined" && a !== null) {
            console.log(localStorage.reloadCount);
            localStorage.reloadCount = 0;
        };
        var reloadCount = parseInt(localStorage.reloadCount, 10);
        console.log(reloadCount);
        if (reloadCount < maxReload) {
            reloadCount += 1;
            localStorage.reloadCount = reloadCount;

            // RELOAD CODE HERE
        };
    };

    // call reloadPage from your code
    reloadPage();
于 2012-04-17T00:37:56.750 回答