window.onload 대 document.onload


709

어느 것이 더 널리 지원 됩니까 : window.onload또는 document.onload?


2
MDN 문서는 다음 과 같은 window이벤트를 설명합니다 . 사용 예 :, . 2019 년 중반부터 모든 주요 브라우저와 호환됩니다. ----- developer.mozilla.org/en-US/docs/Web/API/Window/… ------ developer.mozilla.org/en-US/docs/Web/API/Window/load_eventonloadDOMContentLoadedwindow.addEventListener('DOMContentLoaded', callback)
크레이그 cks 스

파이어 폭스에서 75.0 오늘날에도 여전히 나를 위해, window.onload하고 document.onload있는 다른 서로! window.onload나중에 발생하는 것보다 약간 더로드되었습니다 document.onload! (일부는 문서와 함께 작동하지 않는 창으로 작동합니다! document.onreadstatechange 'complete'에도 적용됩니다!)
Andrew

답변:


722

그들은 언제 발사합니까?

window.onload

  • 기본적으로 콘텐츠 (이미지, CSS, 스크립트 등)를 포함 하여 전체 페이지가로드되면 시작 됩니다.

일부 브라우저에서는 이제 document.onloadDOM이 준비되면 역할을 담당 하고 실행됩니다.

document.onload

  • 이미지 및 기타 외부 컨텐츠가로드 되기 전에 DOM이 준비 될 때 호출됩니다 .

그들은 얼마나 잘 지원됩니까?

window.onload가장 널리 지원되는 것으로 보입니다. 실제로 가장 최신 브라우저 중 일부는로 대체 document.onload되었습니다 window.onload.

브라우저 지원 문제는 많은 사람들이 jQuery 와 같은 라이브러리를 사용 하여 준비중인 문서의 검사를 처리 하기 시작한 이유 일 가능성이 높습니다 .

$(document).ready(function() { /* code here */ });
$(function() { /* code here */ });

역사를 위해. window.onloadvs body.onload:

over 의 사용법과 관련하여 코딩 포럼대해서도 비슷한 질문이 제기되었습니다 . 결과는 구조와 동작을 분리하는 것이 좋기 때문에 사용해야 합니다.window.onloadbody.onloadwindow.onload


25
사실 그 문 사이의 선택에 지시 할 것으로 보인다 window.onload<body onload="">완전히 다른 (그리고 "작업 분리 구조는"이 상황에서 더 많은 의미가 있습니다). 답이 틀렸다는 것이 아니라 그 근거가 있습니다.
Thor84no

2
그 인용문은 문법적으로 끔찍합니다 ... (표시된) 편집 도움말이 아니어야합니까?
Kheldar

@ Thor84no 나는 마침내 이것을 다시 볼 시간을 찾았다. 몇 가지 개선했습니다.
Josh Mein

@ Kheldar 나는 다소 거칠기 때문에 따옴표를 역설하기로 결정했습니다.
Josh Mein

@JoshMein document.onloadjQuery와 JS가 동일 하다는 것을 의미합니까 document.ready?
john cj

276

일반적인 생각은 즉 위해 window.onload 화재 문서의 윈도우 인 경우 프리젠 테이션 준비document.onload 화재DOM 트리 (문서 내에서 마크 업 코드에서 내장이)되어 완료 .

DOM- 트리 이벤트를 구독하면 CPU로드가 거의 발생 하지 않고 Javascript를 통해 오프 스크린 조작이 가능합니다 . 반대로 여러 외부 리소스를 아직 요청, 파싱 및로드하지 않은 경우 실행 하는 데 시간이 걸릴window.onload있습니다 .

► 테스트 시나리오 :

차이점과 선택한 브라우저 가 위에서 언급 한 이벤트 핸들러를 구현 하는 방법 을 관찰하려면 문서의 태그 안에 다음 코드를 삽입하십시오 .<body>

<script language="javascript">
window.tdiff = []; fred = function(a,b){return a-b;};
window.document.onload = function(e){ 
    console.log("document.onload", e, Date.now() ,window.tdiff,  
    (window.tdiff[0] = Date.now()) && window.tdiff.reduce(fred) ); 
}
window.onload = function(e){ 
    console.log("window.onload", e, Date.now() ,window.tdiff, 
    (window.tdiff[1] = Date.now()) && window.tdiff.reduce(fred) ); 
}
</script>

► 결과 :

다음은 Chrome v20 (및 아마도 최신 브라우저)에서 볼 수있는 동작입니다.

  • document.onload이벤트가 없습니다 .
  • onload내부에서 <body>선언되면 <head>(이벤트가 다음과 같이 작동하는 경우)document.onload .
  • 카운터 상태에 따라 카운팅 및 동작을 수행하면 두 이벤트 동작을 모두 에뮬레이션 할 수 있습니다.
  • 또는 window.onloadHTML <head>요소 의 범위 내 에서 이벤트 핸들러를 선언하십시오 .

► 예제 프로젝트 :

위의 코드는 이 프로젝트의 코드베이스 ( index.htmlkeyboarder.js) 에서 가져 왔습니다 .


window 객체이벤트 핸들러 목록은 MDN 설명서를 참조하십시오.


142

이벤트 리스너 추가

<script type="text/javascript">
  document.addEventListener("DOMContentLoaded", function(event) {
      // - Code to execute when all DOM content is loaded. 
      // - including fonts, images, etc.
  });
</script>


Update March 2017

1 바닐라 자바 ​​스크립트

window.addEventListener('load', function() {
    console.log('All assets are loaded')
})


2 jQuery

$(window).on('load', function() {
    console.log('All assets are loaded')
})


행운을 빕니다.


14
"스타일 시트, 이미지 및 서브 프레임의로드가 완료 될 때까지 기다리지 않고 초기 HTML 문서가 완전히로드되고 구문 분석되면 DOMContentLoaded 이벤트가 시작됩니다." - developer.mozilla.org/en/docs/Web/Events/DOMContentLoaded 그래서 당신은 모든 것이이 행사에서로드에 대한 잘못된 것 같다.
ProfK

2
@ProfK, 의견을 보내 주셔서 감사합니다. 당신은 시도 할 수 있습니다 window.addEventListener('load', function() {...}). 또한 답변을 업데이트했습니다.
Akash

4
이 답변에서 내가 좋아하는 점은 평범한 자바 스크립트 솔루션을 제공한다는 것입니다. 대부분의 사람들은 jQuery가 유일한 답변으로 얼마나 자주 제공되는지를 감안할 때 모든 브라우저에 jQuery가 내장되어 있다고 생각합니다.
Dave Land

망할 jquery를로드하는 데 너무 오래 걸리고 $를 찾을 수 없을 때 이중 문제가 발생합니다. 나는 $ (window) .ready 유형의 솔루션이 절대 작동하지 않아야한다고 생각합니다.
Shayne

1
오늘 크롬에서 두 가지를 모두 시도했습니다. CSS와 글꼴을 기다리지 않습니다.
movAX13h

78

에 따르면 구문 분석 HTML 문서 - 끝 ,

  1. 브라우저는 HTML 소스를 구문 분석하고 지연된 스크립트를 실행합니다.

  2. 모든 HTML이 파싱되어 실행될 때 A DOMContentLoaded가 전달됩니다 document. 이벤트가로 버블 링됩니다 window.

  3. 브라우저는로드 이벤트를 지연시키는 리소스 (예 : 이미지)를로드합니다.

  4. 에서 load이벤트가 발송됩니다 window.

따라서 실행 순서는

  1. DOMContentLoadedwindow캡처 단계 의 이벤트 리스너
  2. DOMContentLoaded 이벤트 리스너 document
  3. DOMContentLoadedwindow버블 단계에서의 이벤트 리스너
  4. load이벤트 리스너 ( onload이벤트 핸들러 포함 )window

버블 load이벤트 리스너 ( onload이벤트 핸들러 포함 )를 document호출해서는 안됩니다. 캡처 load리스너 만 호출 할 수 있지만 문서 자체의로드가 아니라 스타일 시트와 같은 서브 리소스의로드로 인해 발생합니다.

window.addEventListener('DOMContentLoaded', function() {
  console.log('window - DOMContentLoaded - capture'); // 1st
}, true);
document.addEventListener('DOMContentLoaded', function() {
  console.log('document - DOMContentLoaded - capture'); // 2nd
}, true);
document.addEventListener('DOMContentLoaded', function() {
  console.log('document - DOMContentLoaded - bubble'); // 2nd
});
window.addEventListener('DOMContentLoaded', function() {
  console.log('window - DOMContentLoaded - bubble'); // 3rd
});

window.addEventListener('load', function() {
  console.log('window - load - capture'); // 4th
}, true);
document.addEventListener('load', function(e) {
  /* Filter out load events not related to the document */
  if(['style','script'].indexOf(e.target.tagName.toLowerCase()) < 0)
    console.log('document - load - capture'); // DOES NOT HAPPEN
}, true);
document.addEventListener('load', function() {
  console.log('document - load - bubble'); // DOES NOT HAPPEN
});
window.addEventListener('load', function() {
  console.log('window - load - bubble'); // 4th
});

window.onload = function() {
  console.log('window - onload'); // 4th
};
document.onload = function() {
  console.log('document - onload'); // DOES NOT HAPPEN
};


스 니펫을 실행하여 document - load - capture실제로 발생합니다. 이는 문서로드가 왜 발생하지 않는지에 대한 검색에서 기대했던 것과 반대입니다. 기 묘하게도 일관성이 없습니다. 때때로 그것은 나타나고 때로는 나타나지 않으며 때로는 두 번 나타납니다 document - load - bubble. 그러나 결코 일어나지 않습니다 . 사용하지 않는 것이 좋습니다 document load.
오류

@erroric 좋은 지적. load이벤트가 외부 리소스로 전달 되는 것을 고려하지 않았습니다 . 해당 이벤트는 버블 링되지 않으므로 일반적으로 문서에서 감지되지 않지만 캡처 단계에 있어야합니다. 이 항목은 <style><script>요소 의로드를 나타 냅니다. Edge가 그것들을 보여주기에 적합하다고 생각하며 Firefox와 Chrome이 잘못되었습니다.
Oriol

감사합니다 Oriol,이 useCapture옵션은 새로운 것을 가르쳐주었습니다.
Paul Watson

w3의 구문 분석 및 렌더링 흐름을 요약 해 주셔서 감사합니다. '로드'이벤트가 발생하면 4 단계 이후에 다른 일이 발생할 수 있는지 궁금합니다. 브라우저에서 페이지를 전혀 건드 리거나 상호 작용하지 않았지만로드 이벤트가 시작된 후에 가져 오는 일부 객체가 여전히 있음을 알았습니다. 그 물체가 무엇인지 알고 있습니까? '비 차단 렌더링 객체?
weefwefwqg3

12

Chrome에서 window.onload는 <body onload=""> Firefox (버전 35.0)와 IE (버전 11) 모두 동일합니다.

다음 스 니펫으로 탐색 할 수 있습니다.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <!--import css here-->
        <!--import js scripts here-->

        <script language="javascript">

            function bodyOnloadHandler() {
                console.log("body onload");
            }

            window.onload = function(e) {
                console.log("window loaded");
            };
        </script>
    </head>

    <body onload="bodyOnloadHandler()">

        Page contents go here.

    </body>
</html>

Chrome 콘솔에 '창이로드 됨'(먼저 표시됨)과 '본문 onload'가 표시됩니다. 그러나 Firefox 및 IE에서는 "body onload"만 표시됩니다. window.onload.toString()IE & FF 콘솔에서 " " 를 실행 하면 다음이 표시됩니다.

"function onload (event) {bodyOnloadHandler ()}"

이는 "window.onload = function (e) ..."할당을 덮어 씁니다.


6

window.onload하고 onunload있는 바로 가기 document.body.onloaddocument.body.onunload

document.onloadonload 모든 HTML 태그의 핸들러는 그러나 트리거 결코 예약 할 것

onload문서에서 ' '-> true


5

window.onload 그러나 그들은 종종 같은 것입니다. 마찬가지로 body.onload는 IE에서 window.onload가됩니다.


1

그러나 Window.onload는 표준입니다. PS3의 웹 브라우저 (Netfront 기반)는 창 개체를 지원하지 않으므로 여기서 사용할 수 없습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.