利用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;
};
}();

最新文章

  1. ajax实例详解(2)
  2. iScroll 优化
  3. 我的第一款windows phone软件
  4. struts2运行机制
  5. Ios 程序封装,安装流程
  6. PhoneGap,Cordova[3.5.0-0.2.6]:生成Android项目时出现错误(An error occurred while listing Android targets)
  7. rsyslogd: error during parsing file /etc/rsyslog.conf, on or before line 55: warnings occured in fil
  8. JavaScript—DOM操作
  9. JSP 之国际化
  10. Foundation框架中日期的操作
  11. Windows Server服务器日常管理技巧
  12. WPF DataTriger 用法示例代码
  13. mysql常用基础操作语法(九)~~外连接查询【命令行模式】
  14. STL --> list用法
  15. Spring之Enterprise JavaBeans (EJB) integration
  16. 【worker】js中的多线程
  17. springMVC_04controller四种配置总结
  18. WePY | 小程序组件化开发框架
  19. 2.2 如何在Visio中写上、下角标
  20. 和组合数有关的dp

热门文章

  1. JavaScript高级编程(一)
  2. poj 3744 Scout YYF I (矩阵快速幂 优化 概率dp)
  3. @Inject.@Resource.@Autowired 的区别
  4. 判断客户浏览器是否支持cookie
  5. Qt之等待提示框(QPropertyAnimation)
  6. SELinux Mysql的error-log文件位置的指定
  7. php 计算本月第一天 本月最后一天 下个月第一天
  8. Javascript模块化编程(三):require.js的用法 (转)
  9. Windows服务调用Quartz.net 实现消息调度
  10. N元数组的子数组之和的最大值