일반적인 onReady 함수의 실현

2008 단어 ready
define([], function(){
 
    function onReady(fn) {
        var DOC = document,
            html = DOC.documentElement,
            W3C = document.dispatchEvent;
        //FF readyState 
        // body DOM 
        if (!DOC.readyState) {
        var readyState = DOC.readyState = DOC.body ? "complete" : "loading";
        }
        // 
        if (DOC.readyState === "complete") {
            setTimeout(fn);
        // IE>=IE9
        } else if (W3C) {
            DOC.addEventListener('DOMContentLoaded', function(){
                if (readyState) {
                    DOC.readyState = 'complete';
                }
                fn();
            }, false);
        } else {
            ieReady(fn);
        }
    }

    function ieReady(fn) {
       try {
           // iframe IE doScroll DOM 
           if (self !== top && self.document.readyState !== 'complete') {
               setTimeout(function(){
                     ieReady.call(window, fn)
                 })
           } else if (self !== top && self.document.readyState === 'complete') {
               arguments[0]();
           } else {
               document.documentElement.doScroll('left');
                 arguments[0]();
           }
         } catch (e) {
             setTimeout(function(){
                 ieReady.call(window, fn)
             })
       }
   };

   AS.extend({
       'onReady': onReady
   });
   return onReady;
})

중대한 버그를 수정합니다.ready 함수는 AMD에서 정의할 수 없기 때문에 비동기적으로 불러올 수 없습니다. 왜냐하면 DOMcontentLoaded 감청의 촉발 시기는 DOM과 JS이기 때문입니다.CSS 불러오기 실행이 완료되면 예외 중 하나는 JS 가설이 동적으로 불러온다는 것입니다. DOMcontentLoaded는 이 비동기적으로 불러오는 js를 기다리지 않습니다. 따라서 DOMcontentLoaded 이벤트의 함수를 동적으로 불러오는 js에 쓴다고 가정합니다. 하나는 Dom이 불러왔지만 동적으로 불러온 js의 DOMcontentLoaded 귀속을 위한 코드가 실행되지 않았을 수도 있습니다.그래서 DOMContentLoaded에 연결된 감청이 실행되지 않을 가능성이 높습니다.

좋은 웹페이지 즐겨찾기