Як я можу змусити браузер дочекатися відображення сторінки до повного завантаження?


78

Ненавиджу, як ви насправді бачите, як завантажуються веб-сторінки. Думаю, було б набагато привабливіше почекати, поки сторінка повністю завантажиться і не буде готова до показу, включаючи всі сценарії та зображення, а потім браузер відобразить її. Отже, у мене є два запитання ...

  1. Як я можу це зробити?
  2. Я цілковито люблю веб-розробку, але чи це звичайна практика? Якщо ні, то чому?

Заздалегідь дякую за вашу мудрість!


49
Мені не подобається, як деякі сторінки нічого не показують, поки все не завантажено. Не робіть помилок, вважаючи, що користувачі думають так само, як і ви.
Фредрік Мерк,

8
Facebook робить це, і це мене просто зливає.
Джош Стодола,

8
Якщо ви зробите це, принаймні переконайтеся, що ви одразу ж вивели повідомлення, що сторінка завантажується ..
Tor Haugen

6
Ви кажете, що ненавидите бачити завантаження сторінки. Я теж іноді - якщо вміст стрибає під час завантаження. Ви можете мінімізувати це, встановивши чіткі розміри для ваших зображень, щоб браузер знав, наскільки великий простір для них залишається, і не мусив переміщувати текст, щоб вмістити їх під час завантаження.
Натан Лонг,

Але в моєму випадку моя панель навігації перезавантажує зображення, які її складають, щоразу, коли ви змінюєте сторінки, і це виглядає жахливо, коли сторінка, яку вона відновлює кожні пару секунд, коли ви натискаєте посилання.
tkbx

Відповіді:


34

Це дуже погана ідея з усіх наведених причин та багато іншого. Тим не менш, ось як ви це робите за допомогою jQuery :

<body>
<div id="msg" style="font-size:largest;">
<!-- you can set whatever style you want on this -->
Loading, please wait...
</div>
<div id="body" style="display:none;">
<!-- everything else -->
</div>
<script type="text/javascript">
$(document).ready(function() {
    $('#body').show();
    $('#msg').hide();
});
</script>
</body>

Якщо користувач вимкнув JavaScript, він ніколи не бачить сторінку. Якщо сторінка ніколи не закінчується, вони ніколи не бачать її. Якщо завантаження сторінки триває занадто довго, вони можуть припустити, що щось пішло не так і просто підуть в інше місце замість * будь ласка, зачекайте ... * ing.


11
Одним із способів обійти проблему без javascript за допомогою цього рішення було б використання <noscript>тегів для "скасування" display:noneефекту.
Chris Thompson

21

Я думаю, це насправді погана ідея. Користувачі люблять бачити прогрес, простий і простий. Утримуючи сторінку в одному стані протягом декількох секунд, а потім миттєво відображаючи завантажену сторінку, користувач відчує, що нічого не відбувається, і ви, ймовірно, втратите відвідування.

Одним із варіантів є показ стану завантаження на вашій сторінці під час обробки матеріалів у фоновому режимі, але це, як правило, зарезервовано для випадків, коли сайт фактично виконує обробку за введенням користувачем.

http://www.webdeveloper.com/forum/showthread.php?t=180958

У підсумку, вам, принаймні, потрібно проявляти деяку візуальну активність під час завантаження сторінки, і я думаю, що завантаження сторінки невеликими шматочками за раз не все так погано (припускаючи, що ви не робите щось, що серйозно сповільнює сторінку час завантаження).


1
Я розробив сайт, який використовує легкий блешню під час завантаження важких речей - важкі речі налаштовані на display: none. Як тільки все завантажується, блешня згасає, а вміст згасає. Це добре працює, оскільки спінер тепер загально розуміється як "завантаження, будь ласка, почекайте" . Примітка: Він використовує jQuery.
ADTC

1
Вважаю несправедливим таке узагальнення. Якщо ви створюєте справді швидкий і швидкий веб-сайт, то хлопчику неприємно, що браузер вирішує зіпсувати досвід, відображаючи кілька кадрів незавершеного відтвореного веб-сайту. Я думаю, що нам слід прагнути до кращого веб-сайту та кращої взаємодії з користувачами. Я не кажу, що виправлення є хорошим виправленням, я б скоріше хотів, щоб браузери чекали, поки це буде закінчено з обробкою. А далі веб-сайту має переконатися, що їх лайно добре оптимізовано і швидко завантажується. Нам не слід будувати системи, щоб програмісти могли уникнути лінивої та поганої поведінки.
BjarkeCK

13

Ось рішення за допомогою jQuery:

<script type="text/javascript">
$('#container').css('opacity', 0);
$(window).load(function() {
  $('#container').css('opacity', 1);
});
</script>

Я помістив цей сценарій відразу після мого </body>тегу. Просто замініть "#container" селектором для елементів DOM, які потрібно приховати. Я спробував кілька варіантів цього (включаючи .hide()/ .show(), та .fadeOut()/ .fadeIn()), і, просто встановлення непрозорості, здається, має найменше шкідливих наслідків (мерехтіння, зміна висоти сторінки тощо). Ви також можете замінити css('opacity', 0)на fadeTo(100, 1)для більш плавного переходу. (Ні,fadeIn() не буде працювати, принаймні не згідно з jQuery 1.3.2.)

Тепер застереження: я реалізував вищезазначене, оскільки використовую TypeKit, і виникає прикрий мерехтіння, коли ви оновлюєте сторінку, а шрифти завантажуються за кілька сотень мілісекунд. Тому я не хочу, щоб на екрані з’являвся текст, поки TypeKit не завантажиться. Але, очевидно, у вас великі проблеми, якщо ви використовуєте наведений вище код і щось на вашій сторінці не вдається завантажити. Є два очевидні шляхи, як його можна вдосконалити:

  1. Максимальний обмеження часу (скажімо, 1 секунда), після якого з’являється все, завантажується сторінка чи ні
  2. Якийсь індикатор завантаження (скажімо, щось із http://www.ajaxload.info/ )

Я не буду заважати впроваджувати тут індикатор завантаження, але обмеження часу просто. Просто додайте це до сценарію вище:

$(document).ready(function() {
  setTimeout('$("#container").css("opacity", 1)', 1000);
});

Отже, у гіршому випадку ваш сайт займе додаткову секунду, щоб з’явитись.


10

Для цього, безперечно, можна використовувати дійсно. Один із них - запобігти натисканню людьми посилань / викликанню подій JavaScript, поки не завантажуються всі елементи сторінки та JavaScript.

В IE ви можете використовувати переходи сторінок, що означає, що сторінка не відображається, поки не буде повністю завантажена:

<meta http-equiv="Page-Enter" content="blendTrans(Duration=.01)" />
<meta http-equiv="Page-Exit" content="blendTrans(Duration=.01)" />

Зверніть увагу на невелику тривалість. Достатньо лише переконатися, що сторінка не відображається, поки вона не буде повністю завантажена.

В FireFox та інших браузерах рішення, яке я використовував, полягає у створенні DIV, який має розмір сторінки та білий колір, а потім у самому кінці сторінки поміщається в JavaScript, який його приховує. Інший спосіб - використовувати jQuery і приховати його також. Не такий безболісний, як рішення IE, але обидва працюють добре.


Щодо рішення Firefox: а як щодо користувачів, які вимкнули JavaScript?
ChristopheD

6
Відповідь @ChristopheD: ті 10 людей у ​​світі, які вимкнули javascript, не зможуть побачити сторінку.
bagofmilk

1
@ChristopheD Здається, що багато речей залежать від JS, тому [принаймні для мого сайту] він і так не буде функціонувати належним чином.
Анонімний пінгвін

5

Відразу після тегу <body> додайте щось подібне ...

 <style> body  {opacity:0;}</style>

І найперше у вашому <head> додайте щось на зразок ...

 <script>
  window.onload = function() {setTimeout(function(){document.body.style.opacity="100";},500);};
 </script>

Наскільки це є доброю або поганою практикою, залежить від ваших відвідувачів та часу очікування.

Питання, яке ще залишається відкритим, і я не бачу тут відповідей, - як бути впевненим, що сторінка стабілізувалась. Наприклад, якщо ви завантажуєте шрифти, сторінка може трохи переформатувати, поки всі шрифти не будуть завантажені та відображені. Я хотів би знати, чи є подія, яка повідомляє мені, що сторінка закінчена з рендерингом.


4

Також переконайтесь, що сервер буферизує сторінку та не відразу (під час створення) передає її в клієнтський браузер.

Оскільки ви не вказали свій стек технологій:

  • PHP: вивчіть ob_start
  • ASP.NET: переконайтеся, що Response.BufferOutput = True (це за замовчуванням)

2
зауважте, що хоча це допоможе при надсиланні величезних динамічно побудованих HTML-сторінок, це не буде працювати для „зовнішніх” пов’язаних зображень та сценаріїв / таблиць стилів (але вони все одно будуть у кеші браузера після завантаження першої сторінки)
ChristopheD

3

обов’язково: "використовувати jQuery"

Я бачив сторінки, які розміщують чорний або білий div, який охоплює все зверху сторінки, а потім видаляє його у події document.load. Або ви могли б використовувати .ready в JQuery Це , так би мовити, це був один з найбільш anoying веб - сторінок , які я коли - небудь бачив, я б порадив проти нього .


3

Ви можете приховати все, використовуючи деякі css:

#some_div
{
  display: none;
}

а потім у javascript призначити функцію document.onload для видалення цього div.

jQuery робить подібні речі дуже простими.


7
Звичайно, якщо у користувача немає JavaScript, він ніколи не побачить вашу сторінку.
Натан Лонг,

3

Хоча це не завжди хороша ідея, ви вільні вирішити, чи справді хочете це зробити. Є кілька різних способів це зробити, і я знайшов тут простий приклад:

http://www.reconn.us/content/view/37/47/

Можливо, не найкращий, але він повинен допомогти вам розробити власне рішення. Удачі.


3

у PHP-Fusion CMS з відкритим кодом, http://www.php-fusion.co.uk , ми робимо це таким чином по суті -

    <?php
        ob_start();
        // Your PHP codes here            
        ?>
        YOUR HTML HERE


        <?php 
        $html_output = ob_get_contents();
        ob_end_clean();
        echo $html_output;
    ?>

Ви не зможете побачити що-небудь, що завантажується по одному. Єдиним завантажувачем буде закрутка вкладок вашого браузера, і він просто відображає все в одну мить після того, як все завантажується. Спробувати.

Цей метод повністю сумісний з файлами html.


2

На додаток до відповіді Тревора Бернхема, якщо ви хочете мати справу з відключеним javascript та відкласти завантаження css

HTML5

<html class="no-js">

    <head>...</head>

    <body>

        <header>...</header>

        <main>...</main>

        <footer>...</footer>

    </body>

</html>

CSS

//at the beginning of the page

    .js main, .js footer{

        opacity:0;

    }

ЯВАСКРИПТ

//at the beginning of the page before loading jquery

    var h = document.querySelector("html");

    h.className += ' ' + 'js';

    h.className = h.className.replace(
    new RegExp('( |^)' + 'no-js' + '( |$)', 'g'), ' ').trim();

JQUERY

//somewhere at the end of the page after loading jquery

        $(window).load(function() {

            $('main').css('opacity',1);
            $('footer').css('opacity',1);

        });

РЕСУРСИ


1

Хоча я погоджуюсь з іншими, що ви не повинні цього хотіти, я лише коротко поясню, що ви можете зробити, щоб зробити невелику різницю, не доходячи до кінця і фактично блокуючи вже наявний вміст - можливо, цього буде достатньо, щоб зберегти обидва ви і ваші відвідувачі щасливі.

Браузер починає завантажувати сторінку і пізніше оброблятиме css та js, розташовані зовні, особливо якщо місце, на яке зв’язано css / js, знаходиться у „правильному“ місці. (Думаю, порада полягає в тому, щоб завантажувати js якомога пізніше та використовувати зовнішній css, який ви завантажуєте в шапці). Тепер, якщо у вас є якась частина вашого css та / або js, яку ви хотіли б застосувати якомога швидше, просто включіть її на саму сторінку. Це буде суперечити порадам таких інструментів продуктивності, як YSlow, але, ймовірно, це збільшить зміну вашої сторінки, яка відображається так, як ви хочете, щоб вона відображалася. Використовуйте це лише тоді, коли це дійсно потрібно!


0

Ви можете почати з того, що головна індексна сторінка вашого сайту міститиме лише повідомлення із записом "Завантаження". Звідси ви можете використовувати ajax для отримання вмісту вашої наступної сторінки та вбудування його в поточну, після завершення видалення повідомлення "Завантаження".

Можливо, вам вдасться уникнути, просто включивши завантажувальний контейнер повідомлень у верхній частині сторінки, який має 100% ширину / висоту, а потім видаліть згаданий div при завантаженні завершено.

Останнє може не працювати ідеально в обох ситуаціях і залежить від того, як браузер надає вміст.

Я не зовсім впевнений, чи це гарна ідея. Для простих статичних сайтів я б сказав, що ні. Однак останнім часом я бачив багато важких сайтів у форматі javascript від дизайнерських компаній, які використовують складну анімацію та складають одну сторінку. Ці сайти використовують повідомлення про завантаження, щоб дочекатися завантаження всіх скриптів / html / css, щоб сторінка працювала належним чином.



0

Не використовувати дисплей: немає. Якщо ви це зробите, ви побачите, як зображення змінюється / змінюється, коли ви показуєте (). Використовуйте видимість: замість цього прихована, і вона розкладе все правильно, але вона просто не буде видно, поки ви не скажете.


0

Сподіваюся, цей код допоможе

 <html>  
    <head>
        <style type="text/css">
          .js #flash {display: none;}
        </style>
        <script type="text/javascript">
          document.documentElement.className = 'js';
        </script>
      </head>
      <body>
        <!-- the rest of your code goes here -->

        <script type="text/javascript" src="/scripts/jquery.js"></script>
        <script type="text/javascript">
          // Stuff to do as soon as the body finishes loading.
          // No need for $(document).ready() here.
        </script>
      </body>
    </html>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.