【经验总结】毁三观的 script.onerror

简介:

为了保证项目的质量,页面动态加载的脚本文件,如果加载失败需进行重试(根据具体情况)。

怎么检测脚本文件是否加载失败呢?脑海里毫无犹豫地蹦出了onerror兄弟,于是写了如下代码

var script = document.createElement('script');
script.onerror = function(evt){
    console.log('File Loaded Error');
};
script.src = 'http://www.cnblogs.com/test.js';
document.getElementsByTagName('head')[0].appendChild(script);

打开chrome试了下,毫无压力地可以运行。script的oneror事件触发,在window对象上是否能够捕捉到呢?于是又试了下:

window.onerror = function(evt){
    console.log('error');
};

var script = document.createElement('script');
script.src = 'http://www.cnblogs.com/test.js';
document.getElementsByTagName('head')[0].appendChild(script);

好吧,chrome君华丽丽地把我忽视了,如下图:

其实浏览器的处理是否有差异呢?于是打开最近服务质量不是很稳定的google君,输入关键词:“script onerror 检测”

排在第一位的是正美兄的文章:《script的onerror事件支持情况调查》(请猛点击)

一下毁三观:script的onerror事件,IE6~8与opera11都不支持 (经肉眼检测,属实)

看来在以上提及浏览器里,只能采取迂回战术了。setTimeout是个万能膏药,本能排斥尽量不采用(只是毫无根据的排斥。。)

其中一种思路:对象检测法

 

function loadjs(url, obj){

    var script = document.createElement('script');

    script.onreadystatechange = script.onerror = function(){
        if( !this.readyState || ( (this.readyState==='loaded' || this.readyState==='complete') && !window[obj]) ){
            console.log('File Loaded Error');
        }
    };
    script.src = url;
    document.getElementsByTagName('head')[0].appendChild(script);
}
loadjs('http://www.cnblogs.com/test.js', 'Feeds');    //假设目标脚本里有Feeds这个对象

上面只是提及可能的思路之一,根据具体场景可能可以采取其他措施,不赘述。

 

相关文章
|
前端开发 Java Spring
求求你不要写满屏的 try...catch 了,这才是优雅的处理方式,真香...
求求你不要写满屏的 try...catch 了,这才是优雅的处理方式,真香...
272 0
求求你不要写满屏的 try...catch 了,这才是优雅的处理方式,真香...
|
前端开发
前端工作总结146-nexttick的使用
前端工作总结146-nexttick的使用
90 0
前端工作总结146-nexttick的使用
|
前端开发
前端工作总结194-nexttick使用
前端工作总结194-nexttick使用
72 0
前端工作总结194-nexttick使用
|
前端开发 JavaScript 数据库
冇事来学系--Vue2.0中Promise详讲(上)
回调地狱 多层回调函数的相互嵌套,就形成了回调地狱
311 0
|
前端开发
冇事来学系--Vue2.0中Promise详讲(下)
then-fs的基本使用 可以通过node下载then-fs。 npm install then-fs
167 0
|
JavaScript 前端开发
冇事来学系--Vue2.0中讲讲生命周期吧
生命周期(Life Cycle) 是指一个组件从创建->运行->销毁的整个阶段,强调的是一个时间段。 生命周期函数:是由vue框架提供的内置函数,会伴随着组件的生命周期,自动按次序执行 。是vue在关键时刻帮我们调用的一些特殊名字的函数。 生命周期函数中的this指向的是vm或组件实例对象
180 0
|
Web App开发 XML 人工智能
学弟学妹看我文章顺利毕业,基于HTML+Javascript五子棋人机博弈系统设计与实现《记得收藏》
学弟学妹看我文章顺利毕业,基于HTML+Javascript五子棋人机博弈系统设计与实现《记得收藏》
193 0
学弟学妹看我文章顺利毕业,基于HTML+Javascript五子棋人机博弈系统设计与实现《记得收藏》
|
存储 Java Android开发
Window十二问(快扶我起来,我还能问)
关于Window,你了解多少呢?看看下面这些问题你都能答上来吗。
170 0
Window十二问(快扶我起来,我还能问)
|
JavaScript Android开发 iOS开发
收下这波 JS 技巧,从此少加班
各种业务开发都离不开对数据的处理,然而遇到的很多数据都是不好处理的。这个时候就需要寻求搜索引擎的帮助。这种方法效率是非常低下的,而且根据作者的个性不能保证其对自己的口味。因此这篇文字包含了一份JS 常用业务函数手册,例如时间格式的处理、用的是哪个手机浏览器,手机号、邮箱的验证,以此来提高你的开发效率 常用 JS 函数 1.时间格式化 界面展示的时间千变万化, 所以一个处理时间的函数,它的重要性就不言而喻了。
|
前端开发 JavaScript
一入前端深似海,从此红尘是路人系列第三弹之浅析JavaScript闭包
前言:最近由于公司项目太忙,很久没有更新博客了,加上之前就一直说要发表一篇有关闭包的博客帮助小伙伴们好好的理解一些JavaScript中的难点。所以,今天趁着国庆假期前赶紧写了去,写完国庆好好出去浪个够。
1804 0