在Chrome中取消document.location.reload(true)

时间:2018-12-23 13:01:25

标签: javascript google-chrome http google-chrome-devtools

我具有检查结果是否在服务器上的功能。

var d = document;
var dl = d.location;
var w = window;
var wt = w.setTimeout;
var X = XMLHttpRequest;
function _checkreload() {
    var x = new X();
    x.open('GET', '?test=results');
    x.onreadystatechange = function (c) {
        if (x.readyState === 4) {
            if (x.status == 205) {
                dl.reload(true);
            } else {
                wt(_checkreload, 200);
            }
        }
    };
    x.send();
};

_checkreload();

有时由于未知原因取消了重新加载:

enter image description here

问题

如何找出重新加载被取消的原因?

请求的详细信息

因为请求被取消,所以详细信息窗格中没有信息。即使某些字节已发送到服务器(甚至从服务器返回到浏览器响应),chrome也不会显示它们。

2 个答案:

答案 0 :(得分:0)

尝试在try {} catch函数内添加_checkReload。如果是在JS方面,这将帮助您了解错误所在。

var d = document;
var dl = d.location;
var w = window;
var wt = w.setTimeout;
var X = XMLHttpRequest;
function _checkreload() {
    try { // Add a try here...
        var x = new X();
        x.open('GET', '?test=results');
        x.onreadystatechange = function (c) {
            if (x.readyState === 4) {
                if (x.status == 205) {
                    dl.reload(true);
                } else {
                    wt(_checkreload, 200);
                }
            }
        };
        x.send();
    } catch (err) { console.log(err); } // ... and a catch there.
};

_checkreload();

当您的函数重新加载HTML页面时,我建议您使用chrome开发人员工具上的enable the Preserve log feature。这对调试很有帮助。

最后但并非最不重要的一点,请注意,如果您从本地主机运行此代码,则可能会遇到CORS错误。

答案 1 :(得分:0)

就像其他评论中提到的那样,看来您的代码正在与加载所有页面资产竞争。

要保护它,您可能需要将函数包装在窗口的load事件的事件侦听器中。

window.addEventListener('load', function(event){
    var d = document;
    var dl = d.location;
    var w = window;
    var wt = w.setTimeout;
    var X = XMLHttpRequest;
    function _checkreload() {
        var x = new X();
        x.open('GET', '?test=results');
        x.onreadystatechange = function (c) {
            if (x.readyState === 4) {
                if (x.status == 205) {
                    dl.reload(true);
                } else {
                    wt(_checkreload, 200);
                }
            }
        };
        x.send();
    };

    _checkreload();
});

如果每200毫秒的计时对此很关键,则可以为窗口的loadstartloadend设置事件监听器,并为每个监听器设置时间戳。事件之间的差异是您初始的setTimeout的偏移量。