Как я могу проверить, готов ли DOM без прослушивателя?

#javascript #dom

#javascript #dom

Вопрос:

Если у меня есть скрипт, который загружается динамически, я хочу, чтобы он подождал, пока DOM не будет готов, прежде чем выполнять код. Однако, если скрипт загружается слишком медленно, DOM уже будет готов, и, следовательно, функция DOM-Ready не будет запущена.

Пожалуйста, никаких фреймворков, я полагаюсь на чистый JavaScript.

Заранее спасибо!

Ответ №1:

Без прослушивателя нет 100% надежного способа гарантировать, что весь DOM загружен. Вы можете сделать что-то вроде этого:

 var myChecker = setInterval(function () {
  var checkElem = document.getElementById('myRefElement');

  if (checkElem != null) {
    clearInterval(myChecker);
    myFunction();
  }
}, 100);
 

Это будет ждать, пока не появится какой-либо целевой элемент, о котором вы заботитесь.

Ответ №2:

Часть пути вниз на этой странице: 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;
 

Ответ №3:

Очень просто — поместите свой скрипт непосредственно перед закрывающим тегом body (если он у вас есть). Это не гарантирует, что DOM готов, но более надежно, что слушатели DOM готовы и запускаются раньше, чем слушатели load.

Ответ №4:

Вот несколько чистых событий javascript domready:

http://snipplr.com/view/6029/domreadyjs/

http://www.geekdaily.net/2007/07/27/javascript-windowonload-is-bad-mkay/

Ответ №5:

фрагмент, который проверяет document.readyState

http://www.dustindiaz.com/smallest-domready-ever