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는 이전 브라우저에 대한 지원을 중단했으며 이제는을 사용하는 이벤트 DOMContentLoaded와 load이벤트 만 가지고 있으며 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.