Javascript-문서가로드되었는지 감지하는 방법 (IE 7 / Firefox 3)


163

문서가로드 된 후 함수를 호출하려고하지만 문서가 아직로드되지 않았을 수도 있습니다. 로드되면 함수를 호출 할 수 있습니다. 로드되지 않으면 이벤트 리스너를 연결할 수 있습니다. 호출되지 않으므로 onload가 이미 실행 된 후에 이벤트 리스너를 추가 할 수 없습니다. 문서가로드되었는지 어떻게 확인할 수 있습니까? 아래 코드를 시도했지만 완전히 작동하지는 않습니다. 어떤 아이디어?

var body = document.getElementsByTagName('BODY')[0];
// CONDITION DOES NOT WORK
if (body && body.readyState == 'loaded') {
    DoStuffFunction();
} else {
    // CODE BELOW WORKS
    if (window.addEventListener) {  
        window.addEventListener('load', DoStuffFunction, false);
    } else {
        window.attachEvent('onload', DoStuffFunction);
    }
}

5
"문서를로드 한 후 함수를 호출하려고하지만 문서가 아직로드되지 않았을 수 있습니다." 계산하지 않습니다.
Richard Simões 2016 년

7
그는 코드 블록이 처음 실행될 때 제어 할 수 없지만 문서로드가 완료되기 전에 DoStuffFunction ()이 호출되지 않도록하고 싶다고 생각합니다.
벤 블랭크

답변:


257

galambalazs가 언급 한 모든 코드가 필요하지 않습니다. 순수한 JavaScript로 브라우저 간을 수행하는 방법은 단순히 테스트하는 것입니다 document.readyState.

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

이것은 jQuery가 수행하는 방식이기도합니다.

JavaScript가로드되는 위치에 따라 간격 내에서 수행 할 수 있습니다.

var readyStateCheckInterval = setInterval(function() {
    if (document.readyState === "complete") {
        clearInterval(readyStateCheckInterval);
        init();
    }
}, 10);

실제로 document.readyState세 가지 상태를 가질 수 있습니다.

문서를로드하는 동안 "로드 중", 구문 분석이 완료되었지만 하위 리소스를로드 한 후에는 "대화식",로드 된 후에는 "완료"를 반환합니다. - 모질라 개발자 네트워크에서 document.readyState

따라서 DOM 만 준비해야하는 경우를 확인하십시오 document.readyState === "interactive". 이미지를 포함하여 전체 페이지를 준비해야하는 경우를 확인하십시오 document.readyState === "complete".


3
@costa 인 경우 document.readyState == "complete"이미지를 포함하여 모든 것이로드되었음을 의미합니다.
laurent

두 이벤트의 조합을 사용 document.readyState하고 있으며 호출 시점에 따라 DOM이 구문 분석 된 후 또는 이후에 함수가 시작되도록합니다. 인터랙티브 이벤트가 readyState있습니까?
Tomáš Zato-복원 모니카

3
사용할 것 /loaded|complete/.test(document.readyState)입니다. 일부 브라우저 document.readyState는 "완료"대신 "로드 됨"으로 설정 되었습니다. 또한 document.readyState는 글꼴이로드되었는지 확인하지 않으므로 플러그인이 없으면 글꼴을 테스트하는 좋은 방법이 없습니다.
Ryan Taylor

2
무엇에 대해 document.onreadystatechange? 브라우저에서 지원하는 경우 더욱 간소화 된 것 같습니다. stackoverflow.com/questions/807878/…

2
document.readyState !== "loading""DOM ready"상태 인지 확인하는 것이 좋습니다 . 이렇게하면 readyState어떤 이유로 늦게 확인 된 경우 ( "대화식"상태 이후) 문제가 발생하지 않습니다.
rnevius

32

도서관이 필요 없습니다. jQuery는이 스크립트를 잠시 동안 사용했습니다 (btw).

http://dean.edwards.name/weblog/2006/06/again/

// Dean Edwards/Matthias Miller/John Resig

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;

  // kill the timer
  if (_timer) clearInterval(_timer);

  // do stuff
};

/* for Mozilla/Opera9 */
if (document.addEventListener) {
  document.addEventListener("DOMContentLoaded", init, false);
}

/* for Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
  document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
  var script = document.getElementById("__ie_onload");
  script.onreadystatechange = function() {
    if (this.readyState == "complete") {
      init(); // call the onload handler
    }
  };
/*@end @*/

/* for Safari */
if (/WebKit/i.test(navigator.userAgent)) { // sniff
  var _timer = setInterval(function() {
    if (/loaded|complete/.test(document.readyState)) {
      init(); // call the onload handler
    }
  }, 10);
}

/* for other browsers */
window.onload = init;

1
정확히 내가 찾던 것-jQuery 라이브러리가없는 jQuery.ready 함수. 고맙습니다!
trictricx

3
질문의 요점을 완전히 놓쳤다. init게시 한이 코드가 페이지가 이미로드 된 후 포함 된 경우에는 실행되지 않습니다. 이는 OP의 핵심입니다. 스크립트가 포함 된 시점을 제어 할 수 없습니다. ( setInterval지점 만 작동 함)
Roatin Marth

3
이것은 라이브러리에 속합니다. 다른 모든 바퀴와 함께 사람들은 일반적으로 다시 발명합니다.
b01

14

JS 프로그래밍을 더 쉽게 만드는 jQuery와 같은 것을 사용하고 싶을 것입니다.

다음과 같은 것 :

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

당신이하고있는 일을하는 것 같습니다.


2
그는 jQuery를 휴대용 방법으로 그것을 어떻게하는지보고 싶어한다면, jQuery의 소스는 :-) 검사에 대한이
토마스 L Holaday

7
명확하지 않은 경우 문서로드 ready() 호출 하면 전달 된 함수가 즉시 실행됩니다.
Ben Blank

2
@Ben Blank : 물론 문서가로드 된 후 jQuery 자체가 포함되지 않는 한;)
Roatin Marth

@Roatin Marth — 실제로도 잘 작동합니다. (FF8 및 IE8에서 jQuery 1.7.1을 사용해 보았습니다.)
Ben Blank

35
-1 : OP가 jQuery를 언급하지 않은 대답이 의미가 있다고해도. 문서를 준비하기 위해 전체 jQuery 프로젝트를 사용하는 것은 과도합니다.
marcgg

8
if(document.readyState === 'complete') {
    DoStuffFunction();
} else {
    if (window.addEventListener) {  
        window.addEventListener('load', DoStuffFunction, false);
    } else {
        window.attachEvent('onload', DoStuffFunction);
    }
}

최신 Chrome에서 작동하지 않는 것 같습니다. document.loaded항상 정의되어 있지 않습니다
Aniket

이것은 2010 년이었다 :). 이제 사용 body.readyState === 'loaded'
하겠습니다

6

실제로이 코드가 domready가 아닌 load 에서 실행되도록 하려면 (즉, 이미지도로드해야 함) 불행히도 ready 함수는이를 수행하지 않습니다. 나는 일반적으로 다음과 같은 일을합니다.

문서 자바 스크립트에 포함합니다 (즉, 항상 onload 발생 전 호출).

var pageisloaded=0;
window.addEvent('load',function(){
 pageisloaded=1;
});

그런 다음 코드 :

if (pageisloaded) {
 DoStuffFunction();
} else {
 window.addEvent('load',DoStuffFunction);
}

(또는 선호하는 프레임 워크에서 이에 해당합니다.)이 코드를 사용하여 향후 페이지에 대한 자바 스크립트 및 이미지 사전 처리를 수행합니다. 내가 받고있는 것들이이 페이지에 전혀 사용되지 않기 때문에 빠른 이미지 다운로드보다 우선하지 않기를 바랍니다.

더 좋은 방법이 있지만 아직 찾지 못했습니다.


4

모질라 파이어 폭스는 이것이 onreadystatechange대안 이라고 말한다 DOMContentLoaded.

// alternative to DOMContentLoaded
document.onreadystatechange = function () {
    if (document.readyState == "complete") {
        initApplication();
    }
}

에서 DOMContentLoadedMozila의 문서는 말합니다 :

DOMContentLoaded 이벤트는 스타일 시트, 이미지 및 서브 프레임이로드를 완료 할 때까지 기다리지 않고 문서가 완전히로드되고 구문 분석 될 때 시작됩니다 (로드 이벤트는 완전히로드 된 페이지를 감지하는 데 사용될 수 있음).

load이벤트는 전체 문서 + 리소스로드에 사용해야 한다고 생각 합니다.


3

위의 JQuery를 사용하는 것이 가장 쉽고 가장 많이 사용되는 방법입니다. 그러나 순수한 자바 스크립트를 사용할 수 있지만 처음에 읽히도록이 스크립트를 헤드에 정의하십시오. 당신이 찾고있는 것은 window.onload이벤트입니다.

아래는 카운터를 실행하기 위해 만든 간단한 스크립트입니다. 그런 다음 카운터는 10 회 반복 후 중지됩니다.

window.onload=function()
{
    var counter = 0;
    var interval1 = setInterval(function()
    { 
        document.getElementById("div1").textContent=counter;
        counter++; 
        if(counter==10)
        {
            clearInterval(interval1);
        }
    },1000);

}

2

이 시도:

var body = document.getElementsByTagName('BODY')[0];
// CONDITION DOES NOT WORK
if ((body && body.readyState == 'loaded') || (body &&  body.readyState == 'complete') ) {
    DoStuffFunction();
} else {
    // CODE BELOW WORKS
    if (window.addEventListener) {
        window.addEventListener('load', DoStuffFunction, false);
    } else {
        window.attachEvent('onload',DoStuffFunction);
    }
}

1

다른 해결책이 있습니다 .MyApp의 새 객체를 만들 때 응용 프로그램을 시작해야하므로 다음과 같습니다.

function MyApp(objId){
     this.init=function(){
        //.........
     }
     this.run=function(){
          if(!document || !document.body || !window[objId]){
              window.setTimeout(objId+".run();",100);
              return;
          }
          this.init();
     };
     this.run();
}
//and i am starting it 
var app=new MyApp('app');

내가 아는 모든 브라우저에서 작동합니다.

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