window.onload 대 <body onload =“”/>


227

window.onload이벤트와 태그 의 onload이벤트의 차이점은 정확히 무엇입니까 body? 언제 어떤 것을 어떻게 사용해야합니까?


2
속성 값을 둘러싸려면 "를 사용해야합니다.
Sven Larson

답변:


218

window.onload = myOnloadFunc그리고 <body onload="myOnloadFunc();">사용하는 다른 방법입니다 같은 이벤트 . 사용 window.onload은 덜 눈에 띄지 않습니다-HTML에서 JavaScript를 가져옵니다.

모든 일반적인 JavaScript 라이브러리 인 Prototype, ExtJS, Dojo, JQuery, YUI 등은 문서가로드 될 때 발생하는 이벤트에 대한 훌륭한 래퍼를 제공합니다. 윈도우 onLoad 이벤트를 수신하고 이에 반응 할 수 있지만 모든 리소스가 다운로드 될 때까지 onLoad가 시작되지 않으므로 마지막 큰 이미지가 페치 될 때까지 이벤트 핸들러가 실행되지 않습니다. 어떤 경우에는 정확히 원하는 것입니다. 다른 경우에는 DOM이 준비되었을 때 청취하는 것이 더 적절하다는 것을 알 수 있습니다.이 이벤트는 onLoad와 비슷하지만 이미지 등을 다운로드하지 않고 발생합니다.


57
그러나 차이점이 있음에 유의해야합니다. 인라인 onload 이벤트가 myOnloadFunc()전역 컨텍스트에서 호출 됩니다 ( this참조 window). 자바 스크립트를 통해 설정하면 요소의 컨텍스트에서 실행됩니다 ( this이벤트가 트리거 된 요소를 나타냅니다). 이 특별한 경우에는 차이가 없지만 다른 요소와는 다릅니다.
mowwwalker

1
@ Walkerneo : 그렇습니다. 물론 JS 라이브러리 this를 사용하면 원하는 경우 참조 하는 객체를 무시할 수 있습니다 .
Richard Turner

@RichardTurner 컨텍스트 바인딩을 변경하기 위해 라이브러리를 사용할 필요는 없습니다. 간단한 .bind () 호출이이를 수행합니다.
Kloar

@Kloar 요즘에는 할 수 있지만 MSIE9 +가 필요합니다. 내가 대답했을 때 훨씬 흔했던 구형 MSIE에서는 polyfill이 필요합니다.
Richard Turner

33

차이는 없지만 둘 다 사용해서는 안됩니다.

많은 브라우저에서 window.onload모든 이미지가로드 될 때까지 이벤트가 트리거되지 않습니다. 원하는 것은 아닙니다. 표준 기반 브라우저에는 이벤트 DOMContentLoaded가 일찍 발생하지만 IE에서 지원하지 않습니다 (이 답변을 작성할 당시). 크로스 브라우저 DOMContentLoaded 기능을 지원하는 Javascript 라이브러리를 사용하거나 사용 가능한 잘 작성된 함수를 찾는 것이 좋습니다. jQuery 's $(document).ready()가 좋은 예입니다.


53
미래의 질문 ... jquery가 없으면 어떻게됩니까?
Sid

54
현재의 질문. jQuery가 현재 프로젝트에 과잉이라면 어떨까요? (jQuery를
두드리지

14
"IE가 지원하지 않는다"고 말할 때 이것이 보편적 인 진실입니까, 아니면 특정 버전의 IE에만 ​​해당됩니까? 이 답변을 작성한 이후 브라우저 세계에서 많은 변화가 있었으므로이 답변을 업데이트해야 할 때입니까?
Bryan Oakley

8
DOMContentLoaded는 이제 IE9 이상에서 지원됩니다. developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
Adam

6
미래에서보고, DOMContentLoaded는 이제 모든 주요 브라우저에서 지원됩니다 caniuse.com/#feat=domcontentloaded
호세 고메즈

21

window.onload몸없이 일할 수 있습니다. 스크립트 태그 만있는 페이지를 작성하여 브라우저에서여십시오. 페이지에 본문이 없지만 여전히 작동합니다 ..

<script>
  function testSp()
  {
    alert("hit");
  }
  window.onload=testSp;
</script>

6
본문 태그가없는 내용을 실제로 추가하면 본문 태그가없는 HTML은 유효하지 않습니다. 또한 스크립트 태그에 유형이 없습니다. 비표준 호환 코드를 수정하는 브라우저에 의존하지 마십시오! (브라우저는 과거 나 미래에 전혀 다르게 또는 전혀 다르게 할 수 있습니다.)
Kissaki

4
@Kissaki : 표준 HTML에는 body 태그가 전혀 필요하지 않습니다!
Robert Siemer

5
위하여 xhtml1 지정 <!ELEMENT html (head, body)>[1] - 및 html401 지정 <!ELEMENT HTML O O (%html.content;)<!ENTITY % html.content "HEAD, BODY">도 [2]. html51 A head element followed by a body element.은 html 컨텐츠를 나타냅니다 . [3] w3.org/TR/xhtml1/dtds.html#a_dtd_XHTML-1.0-Strict w3.org/TR/xhtml1/dtds.html#a_dtd_XHTML-1.0-Strict w3.org/TR/html51/semantics.html#the -html-element- 모든 공통 / 사용 HTML 표준 에는 body 태그 필요하다고 생각 합니다. :)
Kissaki

1
@Kissaki는 HTML이 아닌 XHTML입니다. HTML을 사용하면 SGML DTD에 따라 시작 및 끝 본문 태그와 html 및 헤드 태그를 모두 생략 할 수 있습니다. w3.org/TR/html401/struct/global.html#edef-BODY Start tag: optional, End tag: optional
OdraEncoded

1
@ Kissaki : html5는 더 이상 스크립트 유형이 필요하지 않습니다 (자바 스크립트 인 경우). 이전 버전에 적합합니다.
Mark

10

일반적으로 > 이벤트를 사용 하지 않는 것이 좋습니다 <body onload="". 가능한 한 행동을 콘텐츠와 분리하는 것이 더 깨끗하다고 ​​생각합니다.

즉, 바디 온로드를 사용하면 속도가 약간 향상되는 경우가 있습니다 (보통 나에게는 매우 드 rare니다).

나는 일반적으로 <head내 페이지 의 >에 다음과 같은 것을 넣도록 프로토 타입을 사용하고 싶습니다 .

document.observe("dom:loaded", function(){
  alert('The DOM is loaded!');
});

또는

Event.observe(window, 'load', function(){
  alert('Window onload');
});

위의 내가 여기서 배운 트릭 입니다. HTML 외부의 첨부 이벤트 핸들러 개념을 매우 좋아합니다.

(코드의 철자 실수를 수정하도록 편집하십시오.)


어떤 경우에는 더 빠르며 왜 그런가요?
사키

이 대답은 모든“나”(“나는 선호한다”,“나는 생각한다”)에 대해 매우 주관적으로 보인다. 객관적이고 검증 가능한 사실이 더 이상 없다면 그 인상을 뒷받침합니다.
사키

1
나는 6 년 전에 게시 된 것을 고려할 때 소금 한 덩어리 로이 대답을 취할 것입니다. 업데이트하거나 자신 만의 개선 된 답변을 게시 할 수 있습니다.
Mark Biek

7

'객관적인 질문에 대한 너무 많은 주관적인 답변. "명백하지 않은"JavaScript는 gotos를 사용하지 않는 기존 규칙과 같은 미신입니다. 누군가의 트렌디 한 종교적 신념에 따르지 않고 목표를 안정적으로 달성하는 데 도움이되는 방식으로 코드를 작성하십시오.

다음을 발견 한 사람 :

 <body onload="body_onload();">

지나치게 산만 해지는 것은 지나치게 소박하며 우선 순위가 정해져 있지 않습니다.

일반적으로 JavaScript 코드를 별도의 .js 파일에 넣지 만 HTML에서 이벤트 핸들러를 연결하는 것은 번거롭지 않습니다.


39
눈에 거슬리지 않는 자바 스크립트를 작성해야 할 이유가 있습니다. 100 페이지의 웹앱이 있고 모든 페이지에 포함 된 자바 스크립트 파일에 <body onload = "body_onload ();"> 메소드를 사용했다고 가정 해 보겠습니다. 그런 다음 어떤 이유로 해당 함수의 이름을 변경해야한다고 상상해보십시오. 포함 된 자바 스크립트 파일에 이벤트를 넣으면 1) 변경이 훨씬 간단 해지고 2) 동일한 코드를 반복해서 다운로드하는 대신 자바 스크립트 파일을 1 년 동안 (올바로 구성된 서버에서) 캐시 할 수 있으므로 서버 리소스가 절약됩니다.
앤드류 Ensley

21
그래서 왜 무언가가 추천되는지 배우는 것을 귀찮게하지 않기 때문에 당신은 추천을 "유행 종교적 신념"이라고 표시합니다 ??
hallvors

6
문제는 "이 두 방법의 차이점은 무엇입니까?"와 함께 더 나은 권장 사항에 대한 요청입니다. 당신의 응답은 그 질문에 어떻게 대답합니까?
Richard Turner

1
대량의 파일에 적용 할 수있는 모듈 식 솔루션을 한 곳에서 만드는 모든 상황은 각 파일 자체에 코드를 추가하는 것보다 훨씬 낫습니다. 원래 빌드 시간, 코드 구성 목적, 가독성 및 향후 편집에 더 좋습니다. 그것은 트렌디하지 않고 실제로 웹 프로그래머가 코딩하는 훨씬 더 좋은 방법으로 수용하고있는 java 및 c ++와 같은 언어로 존재하는 오래된 개념입니다.
Jimbo Jonny

1
최신 브라우저의 XSS 공격에 대한 좋은 방어책은 콘텐츠 보안 정책으로 모든 인라인 자바 스크립트를 비활성화하는 것입니다. HTML에서 onload 속성을 사용하지 않는 것이 좋은 이유입니다.
Greg Ball

4

window.onload-모든 DOM, JS 파일, 이미지, Iframe, 확장 및 기타가 완전히로드 된 후 호출됩니다. $ (window) .load (function () {})와 같습니다.

body onload=""-DOM이로드되면 호출됩니다. $ (document) .ready (function () {})와 같습니다.


1
누군가 이것을 얻을 수 있습니까? 많은 포럼 에서이 진술을 보았지만 사양에서 정의 된 위치에 대한 링크는 없었습니다.
crempp 2019 년

1
@crempp body 요소Global 속성 이 있으므로 이것이 사실이 아니라고 말할 것입니다. 그러나 직접 테스트 할 수 있습니다 ( jsbin.com/OmiViPAJ/1/edit 참조) . 여기 에서 body onload 이벤트 전에 이미지 onload 이벤트가 시작된 것을 볼 수 있습니다 .
올라프 Dietsche

2
이 답변은 다른 사람들과 모순된다. 당신은 소스를 제공 할 수 있습니까?
Jimmy Breck-McKye

2
api.jquery.com/ready jQuery 문서는 ".ready () 메소드는 일반적으로 <body onload =" "> 속성과 호환되지 않습니다."라고 말합니다. jQuery에서 body.onload $ (window) .load (..)에 더 가깝다고 생각하지만 여전히 다릅니다.
ccsakuweb

2
이 답변은 완전히 틀 렸으며 투표권이 없어야합니다. 실제로 이러한 유형의 답변은 일반적으로 readyvs onload이벤트 에 대한 가장 큰 오해 중 하나로 인용됩니다 . load모든 스크립트, 이미지 및 스타일 시트를 포함하여 전체 문서가로드 된 후 발생합니다. DOMContentLoaded내장 된 DOM 트리 후하지만, 이미지 등 그 전에 화재 DOMContentLoaded에 등가를 가지고 document.ready하지 load.
rism

2

차이 가 없습니다 ...

원칙적으로 두 가지를 모두 사용할 수 있습니다 (한 번에 하나씩!-)

그러나 가독성과 HTML 코드의 청결을 위해 나는 항상 window.onload를 선호합니다! o]


1

눈에 거슬리지 않는 JS 코드를 작성하려는 경우 (사용해야 함)을 사용하지 않아야합니다 <body onload="">.

다른 브라우저는이 두 가지를 약간 다르게 처리하지만 비슷하게 작동한다는 것을 이해합니다. 대부분의 브라우저에서 두 가지를 모두 정의하면 하나가 무시됩니다.


1

다른 속성과 마찬가지로 onload를 생각하십시오. 예를 들어 입력 상자에 다음을 넣을 수 있습니다.

<input id="test1" value="something"/>

또는 당신은 전화 할 수 있습니다 :

document.getElementById('test1').value = "somethingelse";

onload 속성은 value 속성과 같은 문자열 대신 값으로 함수를 취하는 것을 제외하고는 동일한 방식으로 작동합니다. window.onload를 호출하면 body 태그의 onload 속성 값이 다시 할당됩니다.

또한, 여기에있는 다른 사람들과 마찬가지로, 일반적으로 스타일과 자바 스크립트를 페이지의 내용과 분리하는 것이 더 깨끗하므로 대부분의 사람들은 window.onload 또는 jQuery의 ready 함수를 사용하는 것이 좋습니다.


1

<body onload = "">은 window.onload를 대체해야합니다.

<body onload = "">를 사용하면 document.body.onload가 null이거나 정의되지 않았거나 브라우저에 따라 함수가 될 수 있습니다 (그러나 getAttribute ( "onload")는 익명 함수의 본문을 문자열로 가져 오는 데 다소 일관성이 있어야 함) . window.onload를 사용하면 함수를 할당 할 때 window.onload는 여러 브라우저에서 일관되게 함수가됩니다. 그게 중요하다면 window.onload를 사용하십시오.

어쨌든 콘텐츠에서 JS를 분리하는 데 window.onload가 더 좋습니다. window.onload를 사용할 수있을 때 <body onload = "">을 사용할 이유가별로 없습니다.

Opera에서, window.onload 및 <body onload = ""> (그리고 심지어 window.addEventListener ( "load", func, false))의 이벤트 대상은 Safari 및 Firefox에서와 같은 문서 대신 창이됩니다. 그러나 '이것은 브라우저 전체의 창입니다.

이것이 의미하는 바는 중요 할 때 크루 드를 감싸서 일관되게 만들거나 라이브러리를 사용해야한다는 것입니다.


0

둘 다 동일하게 작동합니다. 그러나 둘 다 정의 된 경우 둘 중 하나만 호출됩니다. 나는 일반적으로 그들 중 하나를 직접 사용하는 것을 피합니다. 대신 이벤트 핸들러를로드 이벤트에 첨부 할 수 있습니다. 이렇게하면 onload 이벤트에 콜백을 연결해야하는 다른 JS 패키지를 더 쉽게 통합 할 수 있습니다.

모든 JS 프레임 워크에는 이벤트 핸들러를위한 브라우저 간 메소드가 있습니다.


0

내용, 레이아웃 및 동작을 분리하는 것이 허용되는 표준입니다. 따라서 window.onload ()는 <body onload="">둘 다 동일한 작업을 수행하는 것보다 사용하기에 더 적합합니다 .


0

죄송 수면의 또 다른 삼년 후 다시 스레드의 환생을 위해, 그러나 아마 나는 마지막의 여지가없는 이익을 찾은 window.onload=fn1;이상을 <body onload="fn1()">. 이것은 JS 모듈 또는 ES 모듈 과 관련이 있습니다. onload핸들러가 "클래식"JS 파일에 있을 때 (즉 <script type="module" … >, 없이 참조 되거나, 어느 쪽이든 가능합니다. onload핸들러가 "모듈"JS 파일에 있을 때 (즉 <script type="module" … >, <body onload="fn1()">"fn1" HTML이 파싱되기 전에 ES 모듈이로드되지 않았기 때문일 수 있습니다. 그러나 그것은 단지 제 추측입니다. 어쨌든, window.onload=fn1;모듈과 완벽하게 작동합니다 ...

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