利用VBScript 检测,有副作用,慎用!

    var loadScript = function () {
var DOC = document,
HEAD = document.getElementsByTagName('head')[0];
// 往head注入一个script
var injectScript = function(src, beforeInject){
var script = document.createElement('script');
beforeInject.call(script);
script.src = src;
script.async = true;
HEAD.insertBefore(script, HEAD.firstChild);
return script;
};
// 销毁script标签
var destoryScript = function(script){
script.onerror = script.onreadystatechange = script.onload = null;
if (script.parentNode) {
script.parentNode.removeChild(script)
}
script = null;
};
return function(src, success, failure){
var dfd = $.Deferred();
if (DOC.dispatchEvent)
// 对于w3c标准浏览器,采用onerror和onload判断脚本加载情况
injectScript(src, function(){
var script = this;
script.onload = function(_, isAbort){
console.log(isAbort);
destoryScript(script);
// dfd.resolve();
};
script.onerror = function(_, isAbort){
destoryScript(script);
// dfd.reject();
};
});
else
// 对于恶心的IE8-,我们通过一个vbscript元素,来检测脚本是否加载成功
injectScript(src, function(){
var vbtest = this, flag = 0;
vbtest.language = 'vbscript';
var errorHandler = function(){
// 错误时,判断脚本是否正在解释,是则标志加载成功
if (vbtest.readyState == 'interactive') {
flag = 1;
}
return false;
};
window.attachEvent('onerror', errorHandler);
vbtest.onreadystatechange = function(_, isAbort){
if (/loaded|complete/.test(this.readyState)) {
// 标志位,当加载成功,置1;
if (flag == 1)
injectScript(src, function(){
var script = this;
script.onreadystatechange = function(){
if (/loaded|complete/.test(this.readyState)) {
destoryScript(script);
// dfd.resolve();
}
};
});
else {
// dfd.reject();
}
// 为window绑定一个错误,当js被误加载成vb的时候,会发生错误,来判断是否加载成功
window.detachEvent('onerror', errorHandler);
destoryScript(vbtest);
}
};
});
// 绑定成功失败
// if (typeof success == 'function') dfd.done(success);
// if (typeof failure == 'function') dfd.fail(failure);
// return dfd;
};
}();

IE8-模拟script onerror的更多相关文章

  1. 解决video.js不兼容ie8问题

    使用视频播放器的时候,常常会让兼容一些浏览器问题,比如兼容ie8浏览器.在工作中使用的是video.js. 如果需要兼容,引入两个js库,就可以做到兼容ie8浏览器 <script src=&q ...

  2. 获取控制台的错误信息 onerror

    js 获取控制台的错误信息 https://www.bbsmax.com/A/Vx5ML2NmJN/ <!DOCTYPE html> <html lang="en" ...

  3. Webpack学习-工作原理(下)

    继上篇文章介绍了Webpack的基本概念,完整流程,以及打包过程中广播的一些事件的作用,这篇文章主要讲生成的chunk文件如何输出成具体的文件.分同步和异步两种情况来分析输出的文件使用的webpack ...

  4. javascript 跨域 的几种方法

      1.jsonp方法 转:https://blog.csdn.net/liusaint1992/article/details/50959571 主要实现功能: 1.参数拼装. 2.给每个回调函数唯 ...

  5. 【读书笔记】《深入浅出Webpack》

    Webpack版本 分析版本为3.6.0 4.0为最近升级的版本,与之前版本变化较大,编译输出的文件与3.0版本会不一致,目前项目中使用的版本3.0版本,所以基于3.0版本进行分析学习. Webpac ...

  6. js跨域请求(jsonp)

    jsonp是跨域请求的手段之一. jsonp的原理: 先来看看下面这段代码 <!DOCTYPE html> <html lang="en"> <hea ...

  7. 原生javascript实现异步的7种方式

    1.$(document).ready 点评: 需要引用jquery :兼容所有浏览器. 2.标签的async=”async”属性 async的定义和用法(是HTML5的属性) async 属性规定一 ...

  8. jQuery使用JSONP时的错误处理

    概述 什么是域,简单来说就是协议+域名或地址+端口,3者只要有任何一个不同就表示不在同一个域.跨域,就是在一个域中访问另一个域的数据. 如果只是加载另一个域的内容,而不需要访问其中的数据的话,跨域是很 ...

  9. vue中引入Tinymce富文本编辑器

    最近想在项目上引入一个富文本编辑器,之前引入过summernote,感觉并不太适合vue使用, 然后在网上查了查,vue中使用Tinymce比较适合, 首先,我们在vue项目的components文件 ...

随机推荐

  1. string.Format 格式化时间,货币

    1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...

  2. python练习程序(c100经典例12)

    题目: 判断101-200之间有多少个素数,并输出所有素数. for i in range(101,201): flag=0; for j in range(2,int(i**(1.0/2))): i ...

  3. eclipse 报错 import ... cannot be resolved 处理方法

    项目上右键,properties, 找java build path,切到libraies标签,将爆红的jdk编辑一下,选用你需要的jdk版本,一般1..我看你类的httpServlet报错,也是这个 ...

  4. 初识jQuery 2013-09-26

    常用选择器 $("#bad")  id选择器 $("div#bad")   id为bad 并且必须是div的元素 $("[href]")  ...

  5. webstorm安装破解版

    破解方法: 现在有个比较简单的注册方法.注册时选择“License server”输入“http://15.idea.lanyus.com/”点击“OK”即可快速激活JetBrains系列产品”

  6. unity, audio falloff

    要达到声音随距离衰减的效果,需要使用3D音效,即把Spatial Blend设为1,然后再调节Min Distance和Max Distance(蓝色线框球体),并选择合适的Volume Rollof ...

  7. bootstrap-datetimepicker时间控件

    欢迎各种吐槽. 本人小前端,学习过程中,某日遇到做时间控件的需求,于是无休止的召唤了度娘,发现看不太懂.算是为自己做个笔记,也便于菜鸟级别的看的懂. 首先,我们看看点击选择时间的时候的展示页面吧 年  ...

  8. rtree

    https://zh.wikipedia.org/wiki/R%E6%A0%91 http://blog.csdn.net/jiqiren007/article/details/5377750 htt ...

  9. JavaScript定时器与执行机制解析

    从JS执行机制说起 浏览器(或者说JS引擎)执行JS的机制是基于事件循环. 由于JS是单线程,所以同一时间只能执行一个任务,其他任务就得排队,后续任务必须等到前一个任务结束才能开始执行. 为了避免因为 ...

  10. YII内置验证规则

    required: 必填字段验证, 来自 CRequiredValidator类的别名 array(‘字段名列表用逗号隔开’, ‘required’),    就这样的一个小小的写法,可以让字段前面加 ...