加载事件方法备忘,chrome和firefox快速刷新的错误及解决办法

加载方面的事件方法备忘:

onload和load的区别
onbeforeunload和onunload的区别


问题:

  1. 测试发过来bug,说——频繁F5刷新页面,会闪现未加载完样式的页面;
    开发用的Chrome,没发现这个问题,测试用的firefox,于是从浏览器的刷新加载机制方面搜索解决办法,没搜到,运气好,最后找到了解决办法
  2. firefox下频繁F5刷新还有个问题——可能ajax未请求完成就刷新了,Chrome下是刷新就自动canceld,但是firefox好像不是,上一次请求的结果因为刷新页面所以执行了error方法,页面闪现一下error方法的结果知道新的页面请求完成。最后想了个办法,刷新就手动取消所有ajax请求

解决方法:

  • 显示未渲染完全的页面:

<head>标签里加上<script>标签,里面放js的onload方法

    <script>
        window.onload=function(){};
    </script>

具体代码:

abortAll()方法:

//定义存储当前还在请求的ajax请求的容器
$.xhrPool = [];
//定义断开所有ajax请求的方法
$.xhrPool.abortAll = function() {
    $(this).each(function(idx, jqXHR) {
        jqXHR.abort();
    });
    $.xhrPool = [];
};

//所有ajax请求的默认配置
$.ajaxSetup({
    beforeSend: function(jqXHR) {
        //发送之前存储当前请求到容器
        $.xhrPool.push(jqXHR);
    },
    complete: function(jqXHR) {
        var index = $.xhrPool.indexOf(jqXHR);
        if (index > -1) {
            //完成之后从容器清除当前请求
            $.xhrPool.splice(index, 1);
        }
    }
})

在header里接着unload写入:

window.onunload=function () {
    $.xhrPool.abortAll();
}

自定义的ajax请求方法:

第一次更正:

function zdyAjax(url, obj, method, datatype, success, err) {
    $.ajax({
        url: url,
        data: obj,
        timeout: 5000,  //设置超时时限
        type: method,
        cache: false,
        datatype: datatype ? datatype : "json",
        success: function (data) {
            success(data);
        },
        error: function (event,textStatus) {
            //当前请求容器为空或错误原因为超时时才执行err
            if($.xhrPool == [] || textStatus=="timeout"){
                err ? err(event) : alert("原函数error");
            }
        }
    });
};

错误原因:

  1. 之前没搞清楚ajax里各个回调方法的执行顺序,实际上,complete是在error之后执行的
    而且!!!abort后请求会继续执行error
  2. 本来的思路是:unload后执行error,因为xhrPool为空所以不会执行error判断。但是这本身就有问题——当没有unload时,xhrPool绝对不会为空,因为至少有正在执行error的这个jqXHR在xhrPool中,这就会导致无论什么时候都不会执行error。
    另外,经过测试,error比unload中的abortAll()更快执行。
    设置变量检测当前是否已经unload了也不行。

第二次更正:

jquery ajax error函数详解
AJAX问题之XMLHttpRequest status = 0
jQuery ajax请求错误返回status 0和错误error的问题

function zdyAjax(url, obj, method, datatype, success, err) {
    $.ajax({
        url: url,
        data: obj,
        timeout: 5000,  //设置超时时限
        type: method,
        cache: false,
        datatype: datatype ? datatype : "json",
        success: function (data) {
            success(data);
        },
        error: function (jqXHR,textStatus,errorthrown) {
            //当前请求容器为空或错误原因为超时时才执行err
            if(jqXHR.status!==0 || textStatus=="timeout"){
                err ? err(jqXHR) : alert("原函数error");
            }
        }
    });
};

总结:

  1. 在发现之前的问题后,我先是用了errorthrown做判断条件,但errorthrown除了会显示abort之外,最多的还是显示“”为空,因为大部分的error执行的比abortAll()快
  2. 改用status做判断条件,status为0,说明当前是中断,或者unsent,opened,则不执行error
    但是!通过Chrome的调试可以看出,同样是status为0,有canceled和failed两种状态,这个还找不到办法判断。
  3. 之所以要判断canceled和failed,是因为前面的timeout,因为有个页面请求时间很长才返回结果所以设置了timeout。当请求这个页面时,有可能是timeout了,调试会显示canceled,status为0,另外一种情况是,请求直接失败了(这个完全不知道咋回事儿,也没unload啊,实际上也是成功发给服务器了啊,可能是因为这个请求发送后会断开和服务器的连接再重连吧?),这种情况下显示是failed,没有超时,status同样为0。这时不会执行error了,不符合预期
  4. 这样的情况下,只能调试着看failed时用了多长时间,再把timeout设的比最短时间再小一些,凑合着用吧。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值