2010-03-23 2 views
4

Я создал сценарий, который работает с Dom, поэтому он должен ждать, пока Dom будет готов, прежде чем выполнить каждую операцию. Я хочу, чтобы этот скрипт можно было включить двумя способами:Firefox DOMContentLoaded проблема с событием

  • В теге head, чтобы он был загружен до того, как Dom был готов. Я использовал document.addEventListener("DOMContentLoaded",function(){...},false) для этого, и он хорошо работает
  • Загружен динамически, когда Dom уже загружен. В этом случае скрипт не работает, потому что по некоторым причинам, если дом уже загружен событие DOMContentLoaded не уволило

Так я хочу знать, есть ли способ проверить, если дом уже загружен так что скрипт может выполнить код без использования события DOMContentLoaded?

PS: это должен быть внешний скрипт, так что я не имею никакого контроля на странице, где она будет включена

ответ

2

Хорошо, это сырный, но он должен работать: Оберните внешний скрипт в Init() метод:

например (И я только предполагаю здесь)

var myModule = { 

    init: function { 
     //all the code goes here 
     /.. 
    } 
} 

Затем поместите ваш импорт сценарий обратно в головной метке, и в самом низу DOM разметки добавить сценарий тег

<script> 
    myModule.init(); 
</script> 

Снова я Wouldn» обычно рекомендую, но если вам нужно избегать проверки загруженного DOM события, то я бы сделал

0

Один из самых простых способов сделать это было бы проверить, если вы можете getElementById что-то в конце страницы. Что-то вроде:

if (document.getElementById('footer')) { /* Dom is probably loaded */ } 
else { /* Dom is probably NOT loaded */ } 

Но на самом деле лучше всего, вероятно, убедиться, что код всегда называется тем же самым способом. вместо этого вы можете использовать событие onload, так как это будет работать во всех браузерах и, как правило, всего лишь через секунду после события DOMContentLoaded. Но, полагаю, это действительно зависит от вас.

+1

Я уже думал об этом методе, но я не знаю, какие элементы есть на странице, поэтому я не могу проверить наличие элемента и по той же причине я не могу использовать событие onload. – mck89

0

Определите функцию: function domReadyHandler() { /* ... */ }

Добавить слушателя событий: document.addEventListener('DOMContentLoaded', domReadyHandler, false);

Execute обработчик после динамической загрузки вашего контента, также: function myXhrCallback() { /* ... */; domReadyHandler(); }

+0

Это означает, что мне нужно изменить всю систему сайта, но я просто хочу использовать скрипт. – mck89

+0

Я предполагаю, что вы используете обертку вокруг XHR. Если да, возможно, вы могли бы вручную запустить «DOMContentLoaded», когда будет выполнен ответ XHR? – janmoesen

+1

Нет, я не использую XHR-оболочку, и этот скрипт не должен зависеть от какой-либо библиотеки, это должен быть внешний скрипт, поэтому я не могу контролировать HTML-код сайта. – mck89

0

Вы можете установить глобальный вар о том, что сценарий динамически включается, в зависимости от этого вы можете запустить прослушиватель загрузки, когда скрипт будет оценен.

window.SCRIPT_IS_DYNAMICALLY_LOADED = true; 
< include script> 

В сценарии:

if (window.SCRIPT_IS_DYNAMICALLY_LOADED) { 
    domContentLoadedListener(); 
} else { 
    document.addEventListener("DOMContentLoaded",domContentLoadedListener, false); 
} 
+1

Это должен быть внешний скрипт, поэтому я не могу контролировать страницу, на которой он будет включен. – mck89

0

Проверьте значение document.readyState. Если значение «complete», вы можете выполнить скрипт, если это что-то еще, добавьте слушателя.

Смежные вопросы