페이지로드 후 JavaScript를 실행하는 방법은 무엇입니까?


736

<script>inside를 사용하여 외부 스크립트를 실행하고 있습니다 <head>.

이제 페이지가로드 되기 전에 스크립트가 실행 되기 때문에 <body>무엇보다도에 액세스 할 수 없습니다 . 문서가 "로드"(HTML 완전히 다운로드 및 RAM 내) 된 후 일부 JavaScript를 실행하고 싶습니다. 스크립트가 실행될 때 연결되어 페이지로드시 트리거되는 이벤트가 있습니까?

답변:


836

이러한 솔루션은 다음과 같이 작동합니다.

<body onload="script();">

또는

document.onload = function ...

또는

window.onload = function ...

참고 것을 마지막 옵션은 갈 수있는 더 좋은 방법 이 있기 때문에 unobstrusive 하고 더 표준으로 간주 .


5
<body onload = "script ();">와 document.onload = function ...의 차이점은 무엇입니까?
Mentoliptus

11
@mentoliptus : document.onload=is non obtrusive en.wikipedia.org/wiki/Unobtrusive_JavaScript
marcgg

3
HTML의 스크립트 ... no no no $ (function () {code here}); <

21
@gerdi OP는 jQuery에 대해 언급하지 않았습니다. 나는 또한 대답에 눈에 거슬리지 않는 옵션을 주었다.
marcgg

1
document.onload가 작동하지 않았습니다. 동일한 게시물 stackoverflow.com/questions/5135638/… 이 게시물을 찾았습니다 . document.onload는 옵션처럼 보이지 않습니다.
spottedmahn

196

로드 타임에 스크립트가 실행되도록 기능을 설정하는 합리적인 프레임 워크가 아닌 프레임 워크 방식 :

if(window.attachEvent) {
    window.attachEvent('onload', yourFunctionName);
} else {
    if(window.onload) {
        var curronload = window.onload;
        var newonload = function(evt) {
            curronload(evt);
            yourFunctionName(evt);
        };
        window.onload = newonload;
    } else {
        window.onload = yourFunctionName;
    }
}

10
내가 6 개월 전에 생각해 낸 내용을 거의 정확하게 올린 +1 제어 할 수없는 다른 프레임 워크 및 코드가 onload 이벤트를 추가하고 다른 onload 이벤트를 지우지 않고 원하는 경우 이와 같은 코드가 필요할 수 있습니다. 구현으로 함수를 포함 시켰으며 var newonload = function (evt) {curronload (evt); newOnload (evt); } 어떤 이유로 든 사용중인 프레임 워크가 이벤트를 onload 이벤트에 전달해야하기 때문에.
Grant Wagner

6
방금 테스트 결과 코드가 attachEvent ()로 연결되면 처리기가 정의되지 않은 순서로 실행되는 것으로 나타났습니다. 처리기 실행 순서가 중요한 경우 window.attachEvent 분기를 생략 할 수 있습니다.
Grant Wagner

따라서이 기능을 추가 기능으로 추가하여 OnLoad를 실행할 수 있습니까? (보다는 기존의 onload 이벤트를 교체)
클레이 니콜스

@ClayNichols : 맞습니다.
혼돈

2
좋은 해결책이지만 지금은 구식입니다 : developer.mozilla.org/en-US/docs/Web/API/EventTarget/…
Renan

192

페이지를로드하는 단계가 두 개 이상입니다. Btw, 이것은 순수한 JavaScript입니다

"DOMContentLoaded"

이 이벤트는 스타일 시트, 이미지 및 서브 프레임이로드를 완료 할 때까지 기다리지 않고 초기 HTML 문서가 완전히로드되고 구문 분석 될 때 시작됩니다. 이 단계에서는 사용자 장치 또는 대역폭 속도에 따라 이미지 및 CSS 로딩을 프로그래밍 방식으로 최적화 할 수 있습니다.

DOM이로드 된 후 실행 (img 및 css 이전) :

document.addEventListener("DOMContentLoaded", function(){
    //....
});

참고 : 동기 JavaScript는 DOM 구문 분석을 일시 중지합니다. 사용자가 페이지를 요청한 후 DOM을 가능한 빨리 구문 분석하려면 JavaScript를 비동기로 설정 하고 스타일 시트로드를 최적화 하십시오.

"하중"

매우 다른 이벤트 인 load완전히로드 된 페이지 를 감지하는 데만 사용해야 합니다 . DOMContentLoaded가 훨씬 더 적합 할 때 load를 사용하는 것은 매우 인기있는 실수이므로 조심하십시오.

모든 것이로드되고 파싱 된 후에 실행됩니다 :

window.addEventListener("load", function(){
    // ....
});

MDN 자료 :

https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded https://developer.mozilla.org/en-US/docs/Web/Events/load

모든 이벤트의 MDN 목록 :

https://developer.mozilla.org/en-US/docs/Web/Events


1
@Peter는 이것이 아마도 자바 스크립트 파일의 맨 아래에 마지막으로 실행되도록하는 것이 가장 좋은 방법이라고 확신합니다
arodebaugh

자바 스크립트 일시 중지 DOM을 렌더링하는 가장 좋은 방법은 페이지 하단에 배치하거나 헤더에 자바 스크립트 비동기를로드하는 것입니다.
DevWL

이것이 가장 완성 된 답변입니다. 온로드는 이후이지만 사람들은 처음에는 이것을 깨닫지 못합니다.
tfont

1
비동기 자바 스크립트 재 : 명확히하기 위해, 즉시 실행되지 않는 스크립트에 대한 두 가지 선택이 있습니다. 이 중 연기 에 일반적으로 바람직하다 비동기 - 때문에 연기가 HTML을 파싱 / 렌더링 중단되지 않습니다 - 실행시와, DOM이 준비가 보장됩니다. defer 및 async로 JavaScript를 효율적으로로드하십시오 .
ToolmakerSteve

하나는 내가 노력 window.onload = ...모든 것이 완벽하게 실행하기 전에 다운로드 한 때까지 내 스크립트를 기다릴 것이라고 생각하지만 것 window.onload같은 실제로 동작합니다을 document.addEventListener("DOMContentLoaded", ...(가) 반면에, window.addEventListener("load", ...정말 모든 것이 완전히 다운로드 될 때까지 기다립니다 않습니다. 나는 그것이 오히려 오히려 window.onload동등해야한다고 생각했을 window.addEventListener("load", ...것입니다 document.addEventListener("DOMContentLoaded", ...?? Chrome과 FF에서 동일한 결과를 얻었습니다.
wkille

121

본문에 "onload"속성을 넣을 수 있습니다

...<body onload="myFunction()">...

또는 jQuery를 사용하는 경우 할 수 있습니다

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

or 

$(window).load(function(){ /*code here*/ })

나는 그것이 당신의 질문에 대답하기를 바랍니다.

$ (window) .load는 문서가 페이지에 렌더링 된 후에 실행됩니다.


65

스크립트가 <head>문서 내에로드 된 경우 defer스크립트 태그 의 속성을 사용할 수 있습니다 .

예:

<script src="demo_defer.js" defer></script>

에서 https://developer.mozilla.org :

연기하다

이 부울 속성은 문서가 구문 분석 된 후 DOMContentLoaded를 실행하기 전에 스크립트가 실행됨을 브라우저에 표시하도록 설정됩니다.

src 속성이없는 경우 (즉, 인라인 스크립트의 경우)이 속성을 사용하면 안됩니다.이 경우에는 효과가 없습니다.

동적으로 삽입 된 스크립트에 대해 비슷한 효과를 얻으려면 async = false를 대신 사용하십시오. defer 속성을 가진 스크립트는 문서에 나타나는 순서대로 실행됩니다.


자바 스크립트 코드가 필요하지 않기 때문에이 솔루션을 좋아하지만 html 속성이 하나만 있으면됩니다. <3
sarkiroka

27

다음은 페이지가로드 된 후 지연된 js로드를 기반으로하는 스크립트입니다.

<script type="text/javascript">
  function downloadJSAtOnload() {
      var element = document.createElement("script");
      element.src = "deferredfunctions.js";
      document.body.appendChild(element);
  }

  if (window.addEventListener)
      window.addEventListener("load", downloadJSAtOnload, false);
  else if (window.attachEvent)
      window.attachEvent("onload", downloadJSAtOnload);
  else window.onload = downloadJSAtOnload;
</script>

이것을 어디에 두어야합니까?

</body>HTML 파일의 맨 아래 근처에있는 태그 바로 앞에 HTML에 코드를 붙여 넣습니다 .

무엇을합니까?

이 코드는 전체 문서가로드 될 때까지 기다렸다가 외부 파일을로드한다고 말합니다 deferredfunctions.js.

위 코드의 예는 다음과 같습니다. JS의 렌더링 지연

나는 자바 스크립트 pagespeed 구글 개념의 지연 로딩을 기반으로 이것을 작성 했으며이 기사에서 제공했습니다.



11

작업 바이올린<body onload="myFunction()">

<!DOCTYPE html>
<html>
 <head>
  <script type="text/javascript">
   function myFunction(){
    alert("Page is loaded");
   }
  </script>
 </head>

 <body onload="myFunction()">
  <h1>Hello World!</h1>
 </body>    
</html>

10
<script type="text/javascript">
  function downloadJSAtOnload() {
   var element = document.createElement("script");
   element.src = "defer.js";
   document.body.appendChild(element);
  }
  if (window.addEventListener)
   window.addEventListener("load", downloadJSAtOnload, false);
  else if (window.attachEvent)
   window.attachEvent("onload", downloadJSAtOnload);
  else window.onload = downloadJSAtOnload;
</script>

http://www.feedthebot.com/pagespeed/defer-loading-javascript.html




7

때로는 더 복잡한 페이지에서 모든 요소가 시간 창에 의해로드되지는 않습니다. 이 경우 함수가 지연되기 전에 setTimeout을 추가하십시오. 우아하지는 않지만 잘 렌더링되는 간단한 해킹입니다.

window.onload = function(){ doSomethingCool(); };

된다 ...

window.onload = function(){ setTimeout( function(){ doSomethingCool(); }, 1000); };

5

<body onload="aFunction()">페이지가로드 된 후 호출되도록 정의 하십시오. 스크립트의 코드는로 묶습니다 aFunction() { }.


4
<body onload="myFunction()">

이 코드는 잘 작동합니다.

그러나 window.onload방법에는 다양한 종속성이 있습니다. 따라서 항상 작동하지 않을 수 있습니다.


3

YUI 라이브러리 사용하기 ( 좋습니다 ) :

YAHOO.util.Event.onDOMReady(function(){
    //your code
});

휴대용과 아름다운! 그러나 다른 것을 위해 YUI를 사용하지 않으면 (문서 참조) 그것을 사용할 가치가 없다고 말할 것입니다.

NB :이 코드를 사용하려면 2 개의 스크립트를 가져와야합니다.

<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/yahoo/yahoo-min.js" ></script>
<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/event/event-min.js" ></script>

3

Javascript 또는 Jquery를 사용하여 문서가로드되었는지 감지 하는 방법에 대한 훌륭한 문서가 있습니다.

네이티브 자바 스크립트를 사용하면이를 달성 할 수 있습니다

if (document.readyState === "complete") {
 init();
 }

간격 내에서 수행 할 수도 있습니다.

var interval = setInterval(function() {
    if(document.readyState === 'complete') {
        clearInterval(interval);
        init();
    }    
}, 100);

예 : Mozilla

switch (document.readyState) {
  case "loading":
    // The document is still loading.
    break;
  case "interactive":
    // The document has finished loading. We can now access the DOM elements.
    var span = document.createElement("span");
    span.textContent = "A <span> element.";
    document.body.appendChild(span);
    break;
  case "complete":
    // The page is fully loaded.
    console.log("Page is loaded completely");
    break;
}

Jquery를 사용하여 DOM이 준비되어 있는지 확인

// A $( document ).ready() block.
$( document ).ready(function() {
    console.log( "ready!" );
});

모든 리소스가로드되었는지 확인하려면 window.load를 사용하십시오.

 $( window ).load(function() {
        console.log( "window loaded" );
    });

3

이 코드를 jQuery 라이브러리와 함께 사용하면 완벽하게 작동합니다.

$(window).bind("load", function() { 

  // your javascript event

});

여기에 몇 가지 설명을 추가
Mathews Sunny

3
$(window).on("load", function(){ ... });

.ready () 가 가장 효과적입니다.

$(document).ready(function(){ ... });

.load () 는 작동하지만 페이지가로드 될 때까지 기다리지 않습니다.

jQuery(window).load(function () { ... });

나를 위해 작동하지 않으며 다음 인라인 스크립트를 중단합니다. 또한 다른 jQuery 포크와 함께 jQuery 3.2.1을 사용하고 있습니다.

오버레이를로드하는 웹 사이트를 숨기려면 다음을 사용하십시오.

<script>
$(window).on("load", function(){
$('.loading-page').delay(3000).fadeOut(250);
});
</script>

3

자바 스크립트

document.addEventListener('readystatechange', event => { 

    // When HTML/DOM elements are ready:
    if (event.target.readyState === "interactive") {   //does same as:  ..addEventListener("DOMContentLoaded"..
        alert("hi 1");
    }

    // When window loaded ( external resources are loaded too- `css`,`src`, etc...) 
    if (event.target.readyState === "complete") {
        alert("hi 2");
    }
});

jQuery와 동일합니다.

$(document).ready(function() {   //same as: $(function() { 
     alert("hi 1");
});

$(window).load(function() {
     alert("hi 2");
});





참고 : -아래의 마크 업을 사용하지 마십시오 (다른 동종 선언을 덮어 쓰기 때문에).

document.onreadystatechange = ...

1

Daniel이 말했듯이 document.onload를 사용할 수 있습니다.

다양한 자바 스크립트 프레임 워크 (jQuery, Mootools 등)는 사용자 정의 이벤트 'domready'를 사용하므로 더 효과적이어야합니다. 자바 스크립트로 개발하는 경우 프레임 워크를 활용하는 것이 좋습니다. 생산성이 크게 향상됩니다.


1

<script type="text/javascript">
$(window).bind("load", function() { 

// your javascript event here

});
</script>


4
이 답변 JQuery와에 따라 달라집니다
Chiptus

0

asnyc페이지로드 후 외부 스크립트를로드하는 데 도움이되는 스크립트 태그에 대한 내 조언 사용 속성

<script type="text/javascript" src="a.js" async></script>
<script type="text/javascript" src="b.js" async></script>

7
따르면 W3 스쿨 , 만약 비동기가 존재한다 : 스크립트는 페이지의 나머지 비동기 실행된다 (페이지는 해석을 계속하는 동안 스크립트가 실행된다) . defer@Daniel Price가 언급 한 것처럼 대신에 의미 했습니까?
jk7

0

자체 실행 온로드 기능 사용

window.onload = function (){
    /* statements */
}();   

2
onload이 방법을 사용하여 다른 처리기를 재정의 할 수 있습니다 . 대신 리스너를 추가해야합니다.
Leonid Dashko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.