DOMContentLoaded 低版本IE兼容

368 阅读1分钟

在IE8部分浏览器及以下,是不支持该事件的

并且该事件不具备 句柄形式 , 所以 attachEvent 也不行

function domReady(fn) {
    if(document.addEventListener) {
        document.addEventListener('DOMContentLoader', function () {
            docuement.removeEventListener('DOMContentLoader', arguments.callee, false) // 队列会等待事件执行完后,再删除该事件
            fn();
        }, false)
    } else if(document.attachEvent) {
        document.attachEvent('onreadystatechange', function () {
            if(document.readyState === 'compete') { 
                // 低版本浏览器, interactive 不稳定
                document.detachEvent('onreadystatechange', argument.callee)
                fn();
            }
        })
    }

    if(document.documentElement.onScroll && typeof(window.frameElement) === 'undefined') {
        // 在低版本中, doScroll在文档没有解析完成时容易报错
        try {
            document.documentElement.doScroll('left');
        } catch (e) {
            return setTimeout(argument.callee, 20)
        }
        fn();
    }
}

callee / caller

callee:正在被执行的函数对象

caller:调用当前函数的引用 (现放在 callee.caller)

attachEvent / detachEvent

低版本采用句柄方式监听事件