Ruby's Louvre

每天学习一点点算法

导航

IE8-模拟script onerror

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

posted on 2013-08-24 10:41  司徒正美  阅读(2046)  评论(0编辑  收藏  举报