jQuery가 아닌 '$ (document) .ready ()'는 무엇입니까?


444

비 jQuery와 동등한 것은 무엇입니까? $(document).ready() 무엇입니까?


4
$(document).ready()라이브러리를 사용하지 않고 jQuery의 이벤트 를 재현하려면 다음을 살펴보십시오. stackoverflow.com/questions/1795089/…
CMS

@OP :의 바닐라 자바 스크립트 구현을위한 프로 자바 스크립트 기술의 89 페이지 체크 아웃 $(document).ready()- books.google.com/... . 또한 addEvent딘 에드워즈 (Dean Edwards)가 작성한 이벤트 바인딩 추상화를 사용하는데 , 그 코드는 다음과 같은 책에도 있습니다.
Russ Cam

답변:


73

좋은 점은 $(document).ready()전에 발사한다는 것 window.onload입니다. 로드 기능은 외부 자산 및 이미지를 포함하여 모든 것이로드 될 때까지 기다립니다. $(document).ready그러나 DOM 트리가 완료되어 조작 할 수있을 때 발생합니다. jQuery없이 DOM을 준비하려면이 라이브러리를 체크인하십시오. 누군가가 단지 추출ready jQuery 일부만 . 멋지고 작으며 유용 할 수 있습니다.

Google 코드의 domready


4
DomReady 코드 네트워크! github의 @CMS를 통해 : github.com/cms/domready/network
Kzqai

45
이것은 질문에 대답하지 않으며 jQuery가 아닌 코드를 표시하지 않습니다. 어떻게 그렇게 많은 투표를 얻었습니까?
Daniel W.

3
@DanielW. 간단하고 실용적이기 때문입니다. 우리 대부분은 여기에 DOM이 자바 스크립트 코드에서 사용될 준비가되었는지 확인하는 방법을 찾고있었습니다.
abarazal

예, 그러나 우리 중 일부는 실제 답변을 위해 여기에 왔습니다.
Slbox

614

이것은 ECMA에서 완벽하게 작동합니다.

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

window.onloadJQuery와 동일하지 않기 $(document).ready때문에 $(document).ready단지 DOM 트리에 대기하는 동안 window.onload외부 자산과 이미지를 포함한 모든 요소를 확인합니다.

편집 : Jan Derk 의 관찰 덕분에 IE8 이상을 추가했습니다 . 이 링크의 MDN에서이 코드의 소스를 읽을 수 있습니다 .

// alternative to DOMContentLoaded
document.onreadystatechange = function () {
    if (document.readyState == "interactive") {
        // Initialize your application or run some code.
    }
}

이외의 다른 옵션이 있습니다 "interactive". 자세한 내용 은 MDN 링크를 참조하십시오.


벤자민과 동의. attachEvent를 사용할 수 없습니다. 예를 들어 Chrome에서는 다음과 같은 결과가 나타납니다. Uncaught TypeError : document.attachEvent is a function. Jan Derk의 답변을 사용하십시오.
Manuel Arwed Schmidt

9
이 스크립트를 호출 할 때 문서가 이미로드되어 있으면 어떻게합니까? 아무 일도 일어나지 않을 것입니다 :(
oriadam

8
아니 @Deerloper, 단지 크롬 콘솔에 그것을 시도 - 아무 일도하지 : document.addEventListener("DOMContentLoaded",function(){console.log(123)})지금 그것을 시도
oriadam

2
브라우저에서 DOMContentLoaded 지원 : caniuse.com/domcontentloaded
기 illa Husta

1
@elliottregan 사실입니다.이 스레드를 오염시키지 않기 위해 주석을 제거합니다. 모두 동일한 작업을 수행하는 것이 좋습니다. 그것은 OC 질문을 넘어 서기 때문에 추가이기 때문에
sospedra

43

내가 한 작은 것

domready.js

(function(exports, d) {
  function domReady(fn, context) {

    function onReady(event) {
      d.removeEventListener("DOMContentLoaded", onReady);
      fn.call(context || exports, event);
    }

    function onReadyIe(event) {
      if (d.readyState === "complete") {
        d.detachEvent("onreadystatechange", onReadyIe);
        fn.call(context || exports, event);
      }
    }

    d.addEventListener && d.addEventListener("DOMContentLoaded", onReady) ||
    d.attachEvent      && d.attachEvent("onreadystatechange", onReadyIe);
  }

  exports.domReady = domReady;
})(window, document);

사용 방법

<script src="domready.js"></script>
<script>
  domReady(function(event) {
    alert("dom is ready!");
  });
</script>

두 번째 인수를 전달하여 콜백이 실행되는 컨텍스트를 변경할 수도 있습니다.

function init(event) {
  alert("check the console");
  this.log(event);
}

domReady(init, console);

2
감사합니다. 나는 이전 버전과 호환된다는 사실을 좋아합니다. 앞으로 나아가는 것이 불행한 사람들을 덜 남겨둔다는 의미는 아닙니다. 어떤 이유로 든 최신 브라우저를 사용할 수없는 것은 불행한 일입니다 ...
CO

28

이제 2018 년이므로 빠르고 간단한 방법이 있습니다.

이벤트 리스너가 추가되지만 이미 시작된 경우 dom이 준비 상태인지 또는 완료되었는지 확인합니다. 하위 리소스로드가 완료되기 전후에 이미지, 스타일 시트, 프레임 등이 발생할 수 있습니다.

function domReady(fn) {
  // If we're early to the party
  document.addEventListener("DOMContentLoaded", fn);
  // If late; I mean on time.
  if (document.readyState === "interactive" || document.readyState === "complete" ) {
    fn();
  }
}

domReady(() => console.log("DOM is ready, come and get it!"));

추가 자료


최신 정보

다음은 TypeScript를 포함하여 작성한 표준 ES6 가져 오기 및 내보내기를 사용하는 빠른 유틸리티 도우미입니다. 어쩌면 나는이 라이브러리를 종속성으로 프로젝트에 설치할 수있는 빠른 라이브러리로 만들 수 있습니다.

자바 스크립트

export const domReady = (callBack) => {
  if (document.readyState === "loading") {
    document.addEventListener('DOMContentLoaded', callBack);
  }
  else {
    callBack();
  }
}

export const windowReady = (callBack) => {
  if (document.readyState === 'complete') {
    callBack();
  }
  else {
    window.addEventListener('load', callBack);
  }
}

TypeScript

export const domReady = (callBack: () => void) => {
  if (document.readyState === "loading") {
    document.addEventListener('DOMContentLoaded', callBack);
  }
  else {
    callBack();
  }
}

export const windowReady = (callBack: () => void) => {
  if (document.readyState === 'complete') {
    callBack();
  }
  else {
    window.addEventListener('load', callBack);
  }
}

약속

export const domReady = new Promise(resolve => {
  if (document.readyState === "loading") {
    document.addEventListener('DOMContentLoaded', resolve);
  }
  else {
    resolve();
  }
});

export const windowReady = new Promise(resolve => {
  if (document.readyState === 'complete') {
    resolve();
  }
  else {
    window.addEventListener('load', resolve);
  }
});

16

http://youmightnotneedjquery.com/#ready 에 따르면 IE8에서 여전히 작동하는 멋진 대체 기능은

function ready(fn) {
  if (document.readyState != 'loading') {
    fn();
  } else if (document.addEventListener) {
    document.addEventListener('DOMContentLoaded', fn);
  } else {
    document.attachEvent('onreadystatechange', function() {
      if (document.readyState != 'loading')
        fn();
    });
  }
}

// test
window.ready(function() {
    alert('it works');
});

개선 사항 : 개인적으로 유형이 fn함수 인지 확인 합니다. 그리고 @elliottregan 은 사용 후 이벤트 리스너를 제거하도록 제안했습니다.

이 질문에 늦게 대답 한 이유는이 답변을 검색했지만 여기서 찾을 수 없기 때문입니다. 그리고 이것이 최선의 해결책이라고 생각합니다.


1
예, 이것은 내 의견으로는 가장 좋은 답변입니다. 읽기 쉽고 DOM이 이미로드 된 경우에도 코드를 실행합니다. 내가 추가 할 유일한 것은 이벤트가 시작된 후 이벤트 리스너를 제거하는 것입니다.
elliottregan

14

표준 기반 대체, DOMContentLoaded가 90 % 이상 브라우저에서 지원되지만 IE8에서는 지원되지 않습니다 (따라서 JQuery는 브라우저 지원을 위해 아래 코드 사용) .

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

jQuery의 기본 기능 은 아래에 표시된 것처럼 window.onload보다 훨씬 복잡합니다.

function bindReady(){
    if ( readyBound ) return;
    readyBound = true;

    // Mozilla, Opera and webkit nightlies currently support this event
    if ( document.addEventListener ) {
        // Use the handy event callback
        document.addEventListener( "DOMContentLoaded", function(){
            document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
            jQuery.ready();
        }, false );

    // If IE event model is used
    } else if ( document.attachEvent ) {
        // ensure firing before onload,
        // maybe late but safe also for iframes
        document.attachEvent("onreadystatechange", function(){
            if ( document.readyState === "complete" ) {
                document.detachEvent( "onreadystatechange", arguments.callee );
                jQuery.ready();
            }
        });

        // If IE and not an iframe
        // continually check to see if the document is ready
        if ( document.documentElement.doScroll && window == window.top ) (function(){
            if ( jQuery.isReady ) return;

            try {
                // If IE is used, use the trick by Diego Perini
                // http://javascript.nwbox.com/IEContentLoaded/
                document.documentElement.doScroll("left");
            } catch( error ) {
                setTimeout( arguments.callee, 0 );
                return;
            }

            // and execute any waiting functions
            jQuery.ready();
        })();
    }

    // A fallback to window.onload, that will always work
    jQuery.event.add( window, "load", jQuery.ready );
}

1
새로운 jQuery는 이전 브라우저에 대한 지원을 중단했으며 이제는을 사용하는 이벤트 DOMContentLoadedload이벤트 만 가지고 있으며 addEventListener, 먼저 두 수신기를 모두 제거하므로 두 번 실행되지 않습니다.
jcubic December

8

라이브러리가없는 일반 바닐라 JavaScript? 오류입니다.$는 식별자 일 뿐이며 정의하지 않으면 정의되지 않습니다.

jQuery는 $자체 "모든 객체"로 정의합니다 ( jQuery다른 라이브러리와 충돌하지 않고 사용할 수 있음). jQuery (또는이를 정의하는 다른 라이브러리)를 사용 $하지 않는 경우 정의되지 않습니다.

아니면 평범한 JavaScript에서 동등한 것이 무엇인지 묻고 있습니까? 이 경우 window.onload에는 똑같지 않지만 바닐라 JavaScript에서 동일한 효과에 가까워지는 가장 빠르고 쉬운 방법입니다.


39
이 답변 (및 아래의 다른 사람들)의 많은 downvoters를 위해 :이 질문을 받았을 때 간단히 : "자바 스크립트에서 $ (document) .ready ()는 무엇입니까? jquery가 아닙니다. 무엇입니까?" jQuery 가로 드되지 않은 일반 바닐라 JavaScript의 의미를 묻는 것처럼 들렸습니다. 내 대답에서, 나는 그 질문에 대답하려고 시도했을뿐만 아니라 jQuery 나 다른 라이브러리가없는 일반 바닐라 JavaScript에 가장 가까운 대답을 제공하려고 노력했습니다. 원래 포스터가 아니라 질문이 무엇인지 추측하는 다른 사람들이 추가 컨텍스트를 추가했습니다.
Brian Campbell

5

최근 브라우저에서 가장 쉬운 방법은 적절한 GlobalEventHandlers , onDOMContentLoaded , onload , onloadeddata (...)를 사용하는 것입니다.

onDOMContentLoaded = (function(){ console.log("DOM ready!") })()

onload = (function(){ console.log("Page fully loaded!") })()

onloadeddata = (function(){ console.log("Data loaded!") })()

DOMContentLoaded 이벤트는 스타일 시트, 이미지 및 서브 프레임이로드를 완료 할 때까지 기다리지 않고 초기 HTML 문서가 완전히로드되고 구문 분석 될 때 시작됩니다. 완전히로드 된 페이지를 감지하기 위해서만 매우 다른 이벤트로드를 사용해야합니다. DOMContentLoaded가 훨씬 더 적합한 load를 사용하는 것은 매우 인기있는 실수이므로 조심해야합니다.

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

사용 된 함수는 IIFE이며이 경우 매우 유용합니다. 준비가되면 트리거됩니다.

https://ko.wikipedia.org/wiki/Immediately-invoked_function_expression

스크립트 끝에 배치하는 것이 더 적절합니다.

ES6에서는 화살표 함수로 작성할 수도 있습니다.

onload = (() => { console.log("ES6 page fully loaded!") })()

가장 좋은 방법은 DOM 요소를 사용하는 것입니다. 우리는 화살표 IIFE를 트리거하는 변수가 준비 될 때까지 기다릴 수 있습니다.

동작은 동일하지만 메모리에 미치는 영향은 줄어 듭니다.

footer = (() => { console.log("Footer loaded!") })()
<div id="footer">

대부분의 경우 문서 객체는 적어도 내 브라우저에서 준비 될 때 트리거 됩니다 . 구문은 매우 훌륭하지만 호환성에 대한 추가 테스트가 필요합니다.

document=(()=>{    /*Ready*/   })()

DOM이 요소를로드 한 후 IIFE가 트리거되기 전에 트리거 할 수 있습니까?
CTS_AE

물론, 그것은 폐쇄에있는 함수, 익명 함수일뿐입니다.
NVRM

0

본문 onLoad도 대안이 될 수 있습니다.

<html>
<head><title>Body onLoad Exmaple</title>

<script type="text/javascript">
    function window_onload() {
        //do something
    }
</script>

</head>
<body onLoad="window_onload()">

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