Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.09.2017, 13:10
Интересующийся
Отправить личное сообщение для TommyWork Посмотреть профиль Найти все сообщения от TommyWork
 
Регистрация: 12.04.2017
Сообщений: 15

DOMContentLoaded vs deffer
Подскажите, почему, подключая скрипты перед закрывающим тегом body, скрипт при перезагрузки страницы без кэширования (ctrl + f5) начинает выполнять скрипты раньше подгрузки DOM узлов?
Причем если засунуть скрипт в head и прописать defer
<script type="text/javascript" src="/js/main.js" defer></script>

происходит то же самое.

То есть если я внутри скрипта прописываю
document.addEventListener('DOMContentLoaded', function() {
//Какой-то код
});

Тогда это все работает адекватно при любом обновлении страницы, f5 и ctrl + f5
Ответить с цитированием
  #2 (permalink)  
Старый 26.09.2017, 13:20
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

TommyWork,
чем ты это проверяешь? alert-ом в chromium? но там он работает неадекватно
Ответить с цитированием
  #3 (permalink)  
Старый 26.09.2017, 13:38
Интересующийся
Отправить личное сообщение для TommyWork Посмотреть профиль Найти все сообщения от TommyWork
 
Регистрация: 12.04.2017
Сообщений: 15

console.log();

Например ширину блока со скроллом через
document.querySelector('.element').scrollWidth;

Или высоту любого элемента.
Ответить с цитированием
  #4 (permalink)  
Старый 26.09.2017, 13:45
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Сообщение от TommyWork Посмотреть сообщение
console.log();

Например ширину блока со скроллом через
document.querySelector('.element').scrollWidth;

Или высоту любого элемента.
Картинки загружаются позже, DOM это сам скелет.
Ответить с цитированием
  #5 (permalink)  
Старый 26.09.2017, 14:08
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

TommyWork,
не понял, а как связана ширина или высота блока с моментом выполнения скрипта??
Ответить с цитированием
  #6 (permalink)  
Старый 26.09.2017, 19:23
Интересующийся
Отправить личное сообщение для TommyWork Посмотреть профиль Найти все сообщения от TommyWork
 
Регистрация: 12.04.2017
Сообщений: 15

Сообщение от Rise Посмотреть сообщение
TommyWork,
не понял, а как связана ширина или высота блока с моментом выполнения скрипта??
Никак. Просто если скрипт подключается перед закрывающим тегом body, почему он выполняется не корректно при обновлении страницы без кэширования?
Например у меня в блоке были элементы расположенные вряд, так вот при таком обновлении выводилась ширина 1 элемента блока, а при простом обновлении с подгрузкой кэша скриптов ширина показывает с учетом всех элементов. И дело тут не в конкретном примере.
Я часто замечаю, что если скрипт подключается в конец файла, без DOMContentLoaded скрипт при загрузки страницы без кэирования работает не корректно. DOMContentLoaded можно заменить на $(document).ready() - если подключен jquery и тоже все окей, но только не для ie9- (по известным причинам). А вот если прописать
document.addEventListener('load', function() {
//Code
});

при подключении js в конец файла и обновлении страницы без кэширования не работает, событие не случается. Думаю это нормально, так как событие load при подключении скрипта в конец файла наступить не может, ДЛЯ САМОГО СКРИПТА ПОДКЛЮЧЕННОГО В КОНЕЦ. (Наверное?)

Отсюда можно сделать вывод, если файл со скриптом подключен в конец, большинство кода должно выполняться по событию DOMContentLoaded.
Хотя если скрипт добавлен в конец, таких проблем быть не должно даже при загрузки страницы без кэширования. Разве нет?

Если кто-то скажет, зачем вообще так делать, сразу могу ответить, что подключать скрипты в конец файла очень удобно, это упрощает постоянно вызывать методы по событию load, а также увеличивает скорость загрузки сайта (по стандартам того же гугла получите + к продвижению в поиске).

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

Если у кого-то есть свое видение решения этого вопроса, просьба поделитесь

Последний раз редактировалось TommyWork, 26.09.2017 в 19:35.
Ответить с цитированием
  #7 (permalink)  
Старый 26.09.2017, 20:16
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Пишите в конец, в чем проблема, сейчас даже
<link rel="stylesheet" href="style.css"/>
которые не отвечает за отображение верней части сайта пишут в конец боди.
Ответить с цитированием
  #8 (permalink)  
Старый 27.09.2017, 05:57
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от TommyWork
Например у меня в блоке были элементы расположенные вряд, так вот при таком обновлении выводилась ширина 1 элемента блока, а при простом обновлении с подгрузкой кэша скриптов ширина показывает с учетом всех элементов.
Во-первых, ты всё опять своей шириной меряешь, это глупо, кэш это хранилище в браузере, а безкэш это хранилище на сервере, а теперь подумай откуда браузер данные быстрей достанет из себя или из вне...
Сообщение от TommyWork
document.addEventListener('load', function() {
//Code
});
при подключении js в конец файла и обновлении страницы без кэширования не работает, событие не случается.
Во-вторых, load это событие window, а не document, и как ты проверял случаемость? опять своей шириной блока? если это "Никак" не связано, зачем ты так проверяешь, ты что идиот?

Отсюда можно сделать вывод что сам там чего то косячишь по коду от своей тупости....
Ответить с цитированием
  #9 (permalink)  
Старый 27.09.2017, 11:37
Интересующийся
Отправить личное сообщение для TommyWork Посмотреть профиль Найти все сообщения от TommyWork
 
Регистрация: 12.04.2017
Сообщений: 15

Rise,
Сообщение от Rise Посмотреть сообщение
Во-первых, ты всё опять своей шириной меряешь, это глупо, кэш это хранилище в браузере, а безкэш это хранилище на сервере, а теперь подумай откуда браузер данные быстрей достанет из себя или из вне...

Во-вторых, load это событие window, а не document, и как ты проверял случаемость? опять своей шириной блока? если это "Никак" не связано, зачем ты так проверяешь, ты что идиот?

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

Последний раз редактировалось TommyWork, 27.09.2017 в 12:08.
Ответить с цитированием
  #10 (permalink)  
Старый 27.09.2017, 12:12
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

TommyWork,
видимо никому не дано понять великого смысла твоих постов... может это ты идиот тогда?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DOMContentLoaded cyber Events/DOM/Window 29 15.07.2012 05:54
Вопрос по DOMContentLoaded Newbie_ Events/DOM/Window 10 19.08.2010 20:00
DOMContentLoaded и defer HelpeR Events/DOM/Window 9 16.11.2009 15:36