HTML / javascript: предотвращение рисования до выполнения кода

У меня есть страница с файлом javascript в конце. файл помещается в конец, так что я получаю доступ ко всем элементам dom. допустим, разметка выглядит так

<html>
<head></head>
<body>
//lot of markup here
<script src = "my-js.js"></script>
<body>

образец разметки просто показывает расположение моего файла js.

первый, как в js-файле (my-js.js), это

document.body.style.visibility = 'hidden';

После запуска кода я снова установил видимость как скрытую.

Из того, что я понял (из множества статей, связанных с этим, включая статьи с stackoverflow), браузер достигает js, затем выполняет его, а затем продолжает рендеринг, а затем рисует. Если это правда, мой описанный код должен работать нормально.

Однако сейчас происходит то, что страница отображается (менее 500 мс) в том виде, в котором она была до выполнения кода, затем быстро скрывается, а затем снова отображается после выполнения кода.

Короче говоря, я хочу: страница скрыта> код выполняется> страница отображается вместо этого я получаю страница отображается> страница скрыта> выполняется код> отображается страница

У меня вопрос: почему страница отображается в течение этой доли секунды? что я здесь делаю не так?

PS: Обратите внимание, что я не могу ни изменить расположение js, ни добавить еще один. Так что не публикуйте решения, которые предлагают то же самое. Что еще более важно, я хочу знать, почему мой код неправильный.

Браузер отображает теги немедленно, прежде чем они попадут на ваш <script>.

SLaks 13.07.2018 17:33

Можно ли встроить стиль в элементы верхнего уровня, чтобы скрыть их?

Chris Farmer 13.07.2018 17:33

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

maX 13.07.2018 17:35

Я бы переместил любой плагин, который портит видимость содержимого моей страницы, в / dev / null в мгновение ока ... Это просто очень плохой UX; Я думаю, что пользователи предпочитают видеть хоть какой-то контент, а не ждать перед пустым экраном.

CBroe 13.07.2018 17:38

@CBroe Каковы бы ни были лучшие практики UX, в конце концов, все зависит от того, чего хочет клиент.

maX 13.07.2018 17:47

@maX - Вы пробовали использовать defer? При правильном использовании это решит вашу проблему. Пожалуйста, смотрите мой ответ ниже.

snack_overflow 13.07.2018 17:48
"файл помещается в конец, чтобы я получил доступ ко всем элементам dom" - и вы действительно думали, что браузеры сначала построят DOM для вашего удобства, но воздержитесь от начала рендеринга чего-либо, потому что мощь - это сценарий, ожидающий в самом конце ...? Нелепо, это сильно замедлило бы текущую сеть, и любая оптимизация «выше сгиба» была бы бессмысленной для начала. [...]
CBroe 13.07.2018 17:49

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

CBroe 13.07.2018 17:49

@snack_overflow да, я сделал. после того, как вы отправили ответ. все тот же. Тег скрипта выглядит так: <script src = 'my-js.js' defer> </script>

maX 13.07.2018 17:50

Для этого нужен CSS, поэтому добавьте body { visibility: hidden; } в свою таблицу стилей, а затем отмените это с помощью своего скрипта.

Ason 13.07.2018 17:52
"какими бы ни были лучшие практики UX, в конце концов, все зависит от того, чего хочет клиент" - если вы упомянули это заранее, это может быть учтено соответствующим образом. Но если вы говорите о клиентах и ​​их «страницах, которые вы не можете контролировать», это звучит так, как будто вы искали решение, которое можно было бы применить в широком смысле на каждом сайте, который интересовался вашим плагином. Реальность браузера ориентирована на то, что приносит пользу большинству, а не на непонятные пожелания клиента. [...]
CBroe 13.07.2018 17:53

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

CBroe 13.07.2018 17:53

Лучше всего, вероятно, будет иметь встроенный скрипт, который ничего не сделает, кроме как установить видимость тела на скрытую на самом верху, чтобы позже ее отменил ваш «основной» скрипт - если они могут встроить ваш скрипт плагина в самый низ и захотят этот эффект тоже должен быть возможен.

CBroe 13.07.2018 17:54

Разве знать почему важнее, чем то, как исправить? ... Если я правильно понял, вы вообще не можете изменить код? ... если да, то как вы можете решить, что скрипт загружается в конце тела, и если вы можете решить, почему вы не можете внести изменения в начало страницы? ....

Ason 13.07.2018 18:29

... вы можете сказать, что вы делаете может вместо того, чтобы говорить, что вы не могу

Ason 13.07.2018 18:33
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
15
898
2

Ответы 2

Возможно, вас заинтересует метод defer.

defer means “wait for the parser to finish to execute this”. It’s roughly equivalent to binding your script to the DOMContentLoaded event, or using jQuery.ready. When the code does run, everything in the DOM will be available for you to use. Unlike async, defer’d code will run in the order it appears in the HTML of the page, it is just deferred until after the HTML is fully parsed.

Например: <script src = "my-js.js" defer></script>

Посмотреть еще здесь

Хотя теоретически это может дать ответ на вопрос, было бы предпочтительнее включает сюда основные части ответа и предоставляет ссылку для справки.

lealceldeiro 13.07.2018 17:37

Хорошо! Будем надеяться, что тот, кто проголосовал против, отозвал свой голос против.

lealceldeiro 13.07.2018 17:41

@maX - Странно. Попробуйте добавить defer перед src и очистите кеш. Это сработало для меня раньше. defer и async действительно полезны.

snack_overflow 13.07.2018 17:50

Классное предложение! +1

NickyTheWrench 13.07.2018 18:27

Во-первых, defer некорректно работает в разных браузерах, во-вторых, в вашей цитате написано "отложено до после, HTML будет полностью проанализирован". Ключевое слово здесь - после, это именно то, что OP хочет нет, поэтому страница мигает, прежде чем она будет скрыта.

Ason 14.07.2018 09:52

@NickyTheWrench Как это круто? ... прочтите мой предыдущий комментарий, и вы увидите, что все наоборот.

Ason 14.07.2018 09:53

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

NickyTheWrench 14.07.2018 19:09

Поместите тег script прямо в начало body, чтобы он оценивался почти так же, как визуализируется body.

<html>
<head></head>
<body>
<script>
document.body.style.visibility = 'hidden';
</script>
<p>Sample text</p>
</body>
</html>

Вы также можете добавить тег style, чтобы скрыть видимость тела.

body{
  visibility: hidden;
}
 <html>
    <head></head>
    <body>
    <p>Sample text</p>
    </body>
 </html>

@maX В таком случае, я не думаю, что вы многое можете сделать.

user10072770 13.07.2018 17:47

body всегда будет выполнять рендеринг до оценки script.

user10072770 13.07.2018 17:48

@maX А можно добавить stylesheet?

user10072770 13.07.2018 17:48

Другие вопросы по теме