代码之家  ›  专栏  ›  技术社区  ›  Grim

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

  •  4
  • Grim  · 技术社区  · 6 年前

    我有一个函数来检查结果是否在服务器上。

    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 回复  |  直到 6 年前
        1
  •  0
  •   Frenchcooc Pawel Dubiel    6 年前

    尝试添加 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();
    

    enable the Preserve log feature 在chrome开发者工具上。这对调试有很大帮助。

    CORS

        2
  •  0
  •   GenericUser    6 年前

    为了保护它,您可能需要将函数封装在 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();
    });
    

    如果每200ms一次的计时对这一点很关键,那么可以为设置一个事件侦听器 loadstart loadend setTimeout .