$ (документ) .ready (функція () {}); проти сценарію внизу сторінки


Відповіді:


142

Дуже мало саме по собі, так чи інакше, DOM буде готовий до того, щоб ви могли оперувати (я нервував з цього приводу, поки не прочитав це від Google ). Якщо ви використовуєте фокус на кінець сторінки, ваш код може бути викликаний щонайменше, щонайменше швидше, але це не матиме значення. Але що ще важливіше, цей вибір стосується того, де ви посилаєте свій JavaScript на сторінку.

Якщо ви включите свій scriptтег до headі покладаєтесь на нього ready, браузер зустріне ваш scriptтег, перш ніж він щось відобразить користувачеві. За звичайного перебігу подій браузер зупиняється, і завантажує ваш сценарій, запускає інтерпретатор JavaScript і передає йому сценарій, потім чекає, поки інтерпретатор обробляє сценарій (а потім jQuery спостерігає різними способами щоб DOM був готовий). (Я кажу "звичайним шляхом", оскільки деякі браузери підтримують атрибути asyncабоdefer в scriptтегах.)

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

Отже, щоб отримати найкращий сприйманий час завантаження, розмістіть свій сценарій внизу сторінки. (Це також керівництво від людей Yahoo .) І якщо ви збираєтеся це робити, тоді немає необхідності використовувати ready, хоча, звичайно, ви могли б, якщо вам сподобалося.

Однак за це є ціна: Ви повинні бути впевнені, що речі, які користувач може бачити, готові до взаємодії. Переміщуючи час завантаження після того, як сторінка в основному відображається, ви збільшуєте можливість того, що користувач почне взаємодіяти зі сторінкою до того, як ваш скрипт буде завантажений. Це один із контраргументів для розміщення scriptтегу в кінці. Часто це не проблема, але вам потрібно заглянути на свою сторінку, щоб перевірити, чи є вона, і якщо так, то як ви хочете з цим боротися. (Ви можете ввести невеликий вбудований script елемент, headякий встановлює обробник подій у цілому документі, щоб впоратися з цим. Таким чином, ви отримуєте покращений час завантаження, але якщо вони намагаються зробити щось занадто рано, ви можете або сказати їм це, або, краще, поставити в чергу те, що вони хотіли зробити, і зробити це, коли ваш повний сценарій буде готовий.)


17
+1. Інший спосіб вирішити взаємодію перед завантаженням js - це зробити сторінку для роботи без JavaScript. Переконайтесь, що всі посилання працюють тощо, хоча вони, звичайно, спричинять перезавантаження сторінки. Потім викрадайте посилання та інші речі за допомогою js і додайте свій ajax чи інші навороти :)
Адріан Шмідт,

1
Як би ви впоралися з чергою до дії? Чи є шаблон дизайну чи якесь «загальне рішення», яке я можу вивчити щодо цього?
HC_

@HC_: Що ви маєте на увазі під "чергуванням дії"?
TJ Crowder

@TJCrowder З останнього речення вашої відповіді: "або, краще, поставте в чергу те, що вони хотіли зробити, і зробіть це, коли ваш повний сценарій буде готовий". Мені просто цікаво, чи існують "оптимальні" способи зробити це, оскільки я впевнений, що зміг би зрозуміти "якийсь" спосіб цього зробити, але я впевнений, що це було б ... з нахмуренням, якщо хтось інший коли-небудь подивився на будь-який код.
HC_

2
@HC_: Я ніколи не відчував потреби це робити і не знаю жодного конкретного стандарту для цього. І через п'ять років, мені здається, було б краще просто замість цього скористатися "Вибачте, завантаження, одна сек ..". (Хоча якщо що - то , що повільно навантаженні, у вас є велика проблема.) Якщо я бачу що - то , я думаю, інтерактивне, і натисніть на нього, і нічого не відбувається, небо знає тільки те , що я натисніть кнопку Далі. Якщо ви поставите їх у чергу, а потім відтворите, коли будете готові, це може бути ... менше, ніж ідеально.
TJ Crowder

3

Ваша сторінка буде завантажуватися повільніше, розсіюючи $(document).ready()скрипти по DOM (а не всі в кінці), оскільки для цього потрібно спочатку синхронно завантажувати jQuery .

$ = jQuery. Таким чином, ви не можете використовувати $свої сценарії без попереднього завантаження jQuery. Цей підхід змушує завантажувати jQuery біля початку сторінки, що зупинить завантаження вашої сторінки до повного завантаження jQuery.

Ви також не можете asyncзавантажити jQuery, оскільки у багатьох випадках ваші $(document).ready()скрипти намагатимуться виконати, перш ніж jQuery повністю завантажиться асинхронно, і спричинить помилку, оскільки знову $ще не визначено.

З огляду на це, існує спосіб обдурити систему. По суті, установка $дорівнює функції, яка перекидає $(document).ready()функції в чергу / масив. Потім у нижній частині сторінки завантажте jQuery, потім перебирайте чергу та виконуйте кожну по черзі $(document).ready(). Це дозволяє відкласти jQuery до кінця сторінки, але все одно використовувати $над ним у DOM. Я особисто не перевіряв, наскільки це добре працює, але теорія обґрунтована. Ідея існувала вже деякий час, але я дуже, дуже рідко бачив, як її реалізували. Але це здається чудовою ідеєю:

http://samsaffron.com/archive/2012/02/17/stop-paying-your-jquery-tax

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.