Атрибут отсрочки (Chrome) - PullRequest
       6

Атрибут отсрочки (Chrome)

31 голосов
/ 17 октября 2010

Chrome для меня всегда был ссылкой на веб-стандарты, к сожалению, defer не поддерживается, и IE поддерживает его с версии 5.5. Почему?

js.js

document.getElementById ("hi").innerHTML = "Hi :)";

HTML

<!DOCTYPE html>
<html>
    <head>
        <meta charset = "utf-8">
        <script defer="defer" src="js.js"></script>
        <title>Hi</title>
    </head>
    <body>
        <div id="hi"></div>
    </body>
</html>

Ответы [ 3 ]

104 голосов
/ 21 октября 2010

Что означают defer и async?

По умолчанию тег <script src=...></script> является злым! Браузер должен прекратить анализ HTML до тех пор, пока скрипт не будет загружен и выполнен (поскольку скрипт может вызывать document.write(...) или определять глобальные переменные, которые будут позже скриптами зависит от). Это означает, что любые изображения и таблицы стилей, которые находятся после тега скрипта, не начинают загрузку до тех пор, пока скрипт не завершит загрузку и выполнение. Внешние сценарии обычно заставляют Интернет загружаться намного медленнее, поэтому NoScript стал таким популярным.

Microsoft представила defer для решения проблемы. Если вы используете <script defer src=...></script>, вы обещаете не звонить document.write(...). Внешний скрипт defer начнет загружаться немедленно, но не будет выполняться до тех пор, пока страница не будет отображена. После отображения страницы все сценарии defer выполняются в том же порядке, в котором они были объявлены. Не все браузеры поддерживают defer.

В HTML5 введен атрибут async, который может выполняться в любое время - возможно, до завершения анализа страницы или даже до других сценариев defer / async, которые все еще загружаются. Но сложнее использовать несколько async скриптов, потому что порядок их выполнения не гарантирован. Как и defer, не все браузеры поддерживают async.

После того, как все сценарии defer и async выполнены, события DOMContentLoaded и load запускаются.

Краткая история defer и async

  • 1997 IE 4 представляет defer.
  • 1998 Спецификация HTML 4 упоминает defer, но, к сожалению, точно не говорится, когда выполняются defer сценарии (Все по порядку? До onload?). Таким образом, ни один другой браузер не реализует defer, потому что никто не хочет перепроектировать поведение IE или нарушать скрипты, которые могут зависеть от особенностей IE. (См., Например, запрос функции Mozilla ).
  • 2006 Черновик HTML5 наконец описывает детали, необходимые для реализации defer: defer все сценарии должны выполняться по порядку после анализа остальной части страницы и до onload. Также вводится async для указания сценариев, которые могут выполняться всякий раз, когда они загружаются, без необходимости ждать друг друга. К сожалению, HTML5 противоречит IE, так как не допускает встроенные defer скрипты. Это нарушает инвариант , что все defer сценарии выполняются по порядку (если некоторые defer сценарии имеют src, а некоторые имеют встроенное содержимое).
  • 2009 Gecko 1.9.1 (Firefox 3.5) поддерживает defer.
  • 2010-01 Gecko 1.9.2 (Firefox 3.6) поддерживает async.
  • 2010-09 defer и async проверены в Webkit . Вы должны увидеть это в Chrome и Safari очень скоро (он уже находится на канале разработчика Chrome, но он немного глючит).
  • Мы все еще ждем, пока Opera реализует defer и async, а IE пока реализует async.

Так, что должен использовать веб-разработчик?

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

фрагмент:

<script>
(function() {
  var script = document.createElement('script');
  script.src = '...';
  script.async = true;
  var s = document.getElementsByTagName('script')[0];
  s.parentNode.insertBefore(script, s);
})();
</script>
  • Если другой сценарий зависит отзагрузите первый сценарий, затем вы можете использовать тот же шаблон, что и выше, но прослушать событие onload первого элемента сценария перед выполнением второго сценария.См. Пример LABjs, чтобы узнать, как ждать загрузки другого сценария .
  • Если у вас несколько сценариев со сложными зависимостями, используйте LAB.js или YUI Loader , чтобы они загружались параллельно и выполнялись в каком-то действительном порядке.
  • Если вы используете популярную библиотеку, такую ​​как jQuery, рассмотрите возможность использования копии Google вместо своей собственнойчтобы повысить вероятность того, что браузер уже кеширует его.

Обновление : если у вас есть сценарии, разбитые на модули, и вы хотите повысить производительность, я рекомендую «Объединение асинхронных сценариев»глава даже более быстрых веб-сайтов Стивом Соудером.Он содержит советы и рекомендации не только для контроля порядка выполнения, но также и для задержки анализа сценариев для повышения производительности.

2 голосов
/ 17 октября 2010

defer поддерживается только Internet Explorer.вам не нужно полагаться на это.Есть и другие способы получить тот же эффект, например, разместить свои скрипты в конце страницы непосредственно перед тегом </body>, как указывали другие.

Цель отсрочки - сообщитьвнешне связанный скрипт для ожидания окончания загрузки страницы до ее запуска.То же самое может быть достигнуто с помощью хороших ненавязчивых методов JavaScript, которые обычно включают в себя код, который предотвращает выполнение сценариев до завершения загрузки DOM.

Преимущество отсрочки возникает в связи с Internet Explorer, поскольку этот браузер являетсятолько тот, который поддерживает атрибут defer.Итак, если вам нужен быстрый скрипт для запуска только в IE, и вы не возражаете, если вся страница загружается до того, как она начнет выполняться, просто добавьте defer = "defer" в ваш тег, и это быстро позаботится об этом.проблема.Устранение проблемы прозрачного PNG в IE6 - одно из возможных практических применений для defer.

Атрибут defer должен использоваться при скрытии скрипта от других браузеров с условным комментарием, предназначенным для скрипта только для IE - в противном случае скрипт будетнормально работать в других браузерах.)

Ссылка: http://www.impressivewebs.com/10-javascript-quick-tips-and-best-practices/

1 голос
/ 17 октября 2010

Если скрипты могут быть отложены, их также можно переместить в нижнюю часть страницы (как указал @Christian в комментариях)

Это было бы лучшим выбором с точки зрения производительности, так какне будет блокировать загрузку остальной части страницы.Вы можете поместить свои сценарии перед тегом </body>.

Этот атрибут плохо поддерживается основными браузерами, и это само по себе должно быть подсказкой для прекращения его использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...