먼저 문제를 정의하겠습니다. window.onload 이벤트는 프로그래머가 웹 응용 프로그램을 시작하는 데 사용됩니다. 이것은 메일 애플리케이션을 초기화하는 것과 같은 메뉴 나 복잡한 것을 움직이는 것과 같이 사소한 것일 수 있습니다. 문제는 모든 페이지 내용 (이미지 및 기타 이진 내용 포함)이로드 된 후에 onload 이벤트가 발생한다는 것입니다. 페이지에 많은 이미지가 포함 된 경우 페이지가 활성화되기 전에 눈에 띄는 지연이 발생할 수 있습니다. 우리가 원했던 것은 모든 성가신 이미지가로드 될 때까지 기다리지 않고 DOM이 완전히로드 된시기를 결정하는 방법입니다.
모질라는 DOMContentLoaded에 맞게 (문서화되지 않은) 맞춤 이벤트를 제공합니다. 다음 코드는 모질라 플랫폼에서 정확히 우리가 원하는 것을 할 것입니다 :
// for Mozilla browsers
if (document.addEventListener) {
document.addEventListener("DOMContentLoaded", init, false);
}
그래서 Internet Explorer 정보를?
IE는 지연 태그에 대해 매우 편리한 (그러나 비표준) 속성을 지원합니다. 이 속성이 있으면 DOM에로드 될 때까지 스크립트의로드를 지연하도록 IE에 지시합니다. 그러나 외부 스크립트에서만 작동합니다. 또 다른 중요한 점은 스크립트를 사용하여이 속성을 설정할 수 없다는 것입니다. 즉, DOM 메소드를 사용하여 스크립트를 생성하고 지연 특성을 설정할 수 없으므로 무시됩니다. 우리의 onload 이벤트 핸들러를 호출하는 코드 한 줄을 것이 외부 스크립트의
<script defer src="ie_onload.js" type="text/javascript"></script>
내용 : 우리는 우리의 onLoad 핸들러를 호출하는 미니 스크립트를 만들 수있는 편리한 연기 속성을 사용
init();
이 접근 방식에는 약간의 문제가 있습니다. 다른 브라우저는 지연 속성을 무시하고 즉시 스크립트를로드합니다. 몇 가지 방법이 있습니다.
<!--[if IE]><script defer src="ie_onload.js"></script><![endif]-->
IE는 conditional compilation을 지원합니다 : 내 선호하는 방법은 다른 브라우저에서 연기 스크립트를 숨길 conditional comments을 사용하는 것입니다. 다음 코드는 위의 HTML에 해당하는 JavaScript입니다.
// for Internet Explorer
/*@cc_on @*/
/*@if (@_win32)
document.write("<script defer src=ie_onload.js><\/script>");
/*@end @*/
지금까지 그렇게 좋았습니까? 이제 나머지 브라우저를 지원해야합니다. 표준 창 하나만 있습니다.onload 이벤트 :
// for other browsers
window.onload = init;
하나의 문제가 남아 있습니다 (누구나 쉽게 할 수 있을까요?). 나머지 브라우저에 대한 onload 이벤트를 트래핑하기 때문에 IE 및 Mozilla에 대해 init 함수를 두 번 호출합니다. 이 문제를 해결하려면 함수를 플래그하여 한 번만 실행되도록해야합니다. 나는이 기술을 보여줍니다 sample page을 제공 한
function init() {
// quit if this function has already been called
if (arguments.callee.done) return;
// flag this function so we don't do the same thing twice
arguments.callee.done = true;
// do stuff
};
: 그래서 우리의 초기화 방법은 다음과 같을 것입니다.
실제 자바 스크립트와 페이지의 위치를 표시해야합니다. 그것이 우리가 도울 수있는 유일한 방법입니다. – jfriend00
제 생각에'window.onload = init;'대신'window.onload = init();'과 같은 일을하는 것이고, 그 일을하기 전에 init 함수를 선언해야합니다. 괄호없이 함수 참조를 지정합니다. 괄호를 사용하면 즉시 실행됩니다. – jfriend00
당신은 페이지/DOM이 준비되었을 때 함수를 호출하는 방법에 대해 [jQuery의 $ .ready()와 동일한 JavaScript [pure JavaScript]를 읽을 수 있습니다.] (http://stackoverflow.com/questions/9899372/pure-javascript- 동등 - 투 - jquerys - 준비 - 어떻게 - 기능 - 때 -/9899701 # 9899701) – jfriend00