Подтвердить что ты не робот

Как определить, был ли запущен DOMContentLoaded

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

Я хочу просто:
Как я могу узнать, что DOMContentLoaded был запущен к моменту запуска файла?

Почему это так сложно?
В IE document.readyState показывается интерактивно перед DOMContentLoaded.
Я не будет использовать обнаружение браузера каким-либо образом, это против политики меня и остальных участников.

Какая правильная альтернатива?

Edit:

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

4b9b3361

Ответ 1

Я бы подумал, что вы можете использовать:

if (document.readyState === "complete" || document.readyState === "loaded") {
     // document is already ready to go
}

Это поддерживается в IE и webkit в течение длительного времени. Он добавлен в Firefox в 3.6. Здесь spec. "loaded" предназначен для более старых браузеров Safari.

Если вы хотите знать, когда страница была проанализирована, но все подресурсы еще не загружены, вы можете добавить "интерактивное" значение:

if (document.readyState === "complete" 
     || document.readyState === "loaded" 
     || document.readyState === "interactive") {
     // document has at least been parsed
}

Помимо этого, если вы действительно просто хотите знать, когда DOMContentLoaded запущен, вам придется установить обработчик событий для этого (перед тем, как он срабатывает) и установить флаг при его запуске.

Эта документация по MDN также очень хорошо читается, чтобы больше узнать о состояниях DOM.

Ответ 2

document.readyState изменяется при запуске этого события. Таким образом, вы можете проверить значение readyState, и таким образом сообщите, было ли событие запущено или нет. Вот код для запуска start(), когда документ готов для него:

if (/comp|inter|loaded/.test(document.readyState)){
    // In case DOMContentLoaded was already fired, the document readyState will be one of "complete" or "interactive" or (nonstandard) "loaded".
    // The regexp above looks for all three states. A more readable regexp would be /complete|interactive|loaded/
    start();
}else{
    // In case DOMContentLoaded was not yet fired, use it to run the "start" function when document is read for it.
    document.addEventListener('DOMContentLoaded', start, false);
}

Ответ 3

Попробуйте это или посмотрите на ссылку

<script>
    function addListener(obj, eventName, listener) { //function to add event
        if (obj.addEventListener) {
            obj.addEventListener(eventName, listener, false);
        } else {
            obj.attachEvent("on" + eventName, listener);
        }
    }

    addListener(document, "DOMContentLoaded", finishedDCL); //add event DOMContentLoaded

    function finishedDCL() {
        alert("Now DOMContentLoaded is complete!");
    }
</script>

Примечание

Если у вас есть <script> после <link rel="stylesheet" ...>

страница не завершит синтаксический анализ - и DOMContentLoaded не будет срабатывать - пока не будет загружена таблица стилей

Ответ 4

Если вы хотите узнать "точно", если был запущен DOMContentLoaded, вы можете использовать логический флаг следующим образом:

var loaded=false;
document.addEventListener('DOMContentLoaded',function(){
loaded=true;
...
}

затем установите флажок:

if(loaded) ...

Ответ 5

Вот что, если какая-то другая библиотека (например, jQuery) уже использовала DOMContentLoaded, вы не сможете использовать ее снова. Это может быть плохая новость, потому что вы в конечном итоге не сможете ее использовать. Вы скажете, почему бы просто не использовать $(document).ready(), потому что, NO!, не все должно использовать jQuery, особенно если это другая библиотека.