Как я могу проверить, готов ли DOM без слушателя? - PullRequest
0 голосов
/ 21 октября 2011

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

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

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

Ответы [ 5 ]

1 голос
/ 21 октября 2011

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

1 голос
/ 21 октября 2011

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

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

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

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

1 голос
/ 21 октября 2011

Частично на этой странице: 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;
0 голосов
/ 21 октября 2011

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

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

0 голосов
/ 21 октября 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...