JavaScript во внешнем файле выполняется до события onload тега script

1

Я читал, что defer не обязательно задержать загрузку внешнего сценария, но он будет отложить выполнение сценария до после того, как HTML был проанализирован.

Изображение 174551

В качестве эксперимента я добавляю строку в конец файла, содержащего jQuery, который испускает событие, когда выполнение доходит до конца JavaScript:

window.dispatchEvent(new Event('jQuery-executed'));

Я включаю файл jQuery на моей тестовой странице с атрибутом defer:

<script src="jquery-3.2.1.js" defer onload="console.log('jQuery loaded', Date.now());"></script>
<script>
    window.addEventListener('DOMContentLoaded', function(){
        console.log('DOMREADY', Date.now());
    });

    window.addEventListener('jQuery-executed', function(){
        console.log('jQuery executed', Date.now());
    });
</script>

У меня есть обработчик onload в теге скрипта, чтобы сообщить мне, когда файл был загружен, а другие функции выводят консольные журналы в DOMContentLoaded и когда выполняется jQuery.

Почему, когда я просматриваю эту страницу, я получаю это?

Изображение 174551

Неужели все должно происходить в другом порядке? Не следует ли jQuery выполнять только после того, как загруженный файл загружен? И почему это выполняется перед DOMContentLoaded?

  • 1
    Проверьте спецификацию W3C HTML5. Событие load запускается после запуска содержимого скрипта, а не до.
  • 0
    Также имеет смысл для DOMContentLoaded ждать загрузки сценариев, поскольку код в обработчике должен должным образом ожидать присутствия всех сценариев.
Показать ещё 3 комментария
Теги:
javascript-events
event-handling
events
loading

1 ответ

2
Лучший ответ

Спецификация HTML5 является странной и трудно читаемой, но она говорит, что отложенный контент сценария должен быть оценен до того, как будет запущено событие "load". Если вы думаете об этом, это действительно хорошо: если у вас есть код, ожидающий загрузки скрипта, возможно, потому, что вы хотите использовать какой-то код, предоставленный сценарием. Если событие "load" было запущено до запуска скрипта, было бы бесполезно иметь обработчик "load".

То же самое касается "DOMContentReady": код, ожидающий, что это событие будет правильно срабатывать, ожидает, что все содержимое скрипта, импортированное этой страницей, будет доступно для использования.

  • 1
    Хорошее объяснение, спасибо Пойнти. Этот порядок событий действительно очень полезен для меня: он дает мне уверенность, что JS в файле доступен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню