Почему код после тега</html> перемещается до</body>? Есть ли выигрыш в производительности?

Чтение других сообщений, таких как этот вопрос SO, приведет меня к эта нечетная рекомендация Google по оптимизации CSS. "Нечетные" , являющиеся их рекомендацией по отсрочке загрузки CSS, заканчивались следующим образом:

        <div class="blue">Hello, world!</div>
    </body>
</html>
<noscript><link rel="stylesheet" href="small.css"></noscript>

Помимо кажущегося чрезмерного, сбивающего с толку, имеющего недействительный HTML и заявляющего: "Порядок использования правил CSS поддерживается... через javascript". хотя javascript не показан... мой вопрос таков:

При тестировании своего примера и проверке результата весь код, который происходит после </html>, перемещается непосредственно перед </body>. Итак, мой вопрос... ПОЧЕМУ?

  • Почему это было перемещено? Кажется, что все основные браузеры пытаются учесть код после </html>, переместив его до </body>. Я немного искал и не мог найти никаких документов/стандартов.

  • Почему Google даже рекомендует это? Как и в том, есть ли реальная практическая польза для этого? Потому что я думаю, что положить его до начала </body> для начала будет достаточно. (и относительно хорошего субъективного объяснения BoltClock, есть ли какие-либо убедительные доказательства того, что на самом деле есть увеличение производительности?)

Это произошло в IE11, Firefox 26, Chrome 32.x и Windows Safari 5.1.7. Проверенный HTML был:

        <div class="blue">Hello, world!</div>
        <noscript><link rel="stylesheet" href="small.css"></noscript>
    </body>
</html>

Добавление дополнительного кода после </html> имело тот же результат.

Это напоминает мне другую нечетную коррекцию ошибок, например, как браузеры будут отображать теги <image> как <img> (ref)...

UPDATE: Для тестирования я настраиваю этот URL для НЕ отложенного CSS, а также this URL для отложенного CSS (ну, что я ожидаю от этой статьи)...

Ответ 1

Теперь это нечетно. Вам не разрешено иметь какие-либо элементы после тега </html>, потому что html является корневым элементом HTML-документа.

  • Но это HTML, а не XHTML. Вместо того, чтобы просто не работать (как это было с XHTML), браузер просто берет все, что появляется в конце документа (кроме комментариев, и я верю в пробелы) и перемещает его в конец тела документа и делает вид, что все в порядке.

    До HTML5 в таких случаях не было стандартов для обработки ошибок, просто потому, что оно недействительно для каких-либо элементов после корневого элемента. В HTML5 практически вся обработка ошибок учитывается в разделе раздел 8.2.5. В частности, он утверждает, что в после тела "или" после body ", если есть неожиданный токен, который не является тегом DOCTYPE, комментария или </html>, тогда анализатор должен переключить режим вставки на" в теле "для обработки токена, что означает он должен быть вставлен в тело вместо этого. Как видно из названий режимов вставки, это означает, что контент добавляется в конец тела.

  • У меня нет объективного ответа относительно того, почему Google рекомендовал бы это, но я считаю, что Google уделяет приоритетное внимание производительности над соблюдением стандартов, особенно в тех случаях, когда недопустимая разметка не вызывает серьезных проблем. Они такие же рисковые (см. Также: Google Chrome), но я отвлекаюсь.

    Вы упоминаете, что элементы noscript и link находятся непосредственно перед тегом </body> end, который, как вы видели, заканчивается тем, что в любом случае заканчивается браузерами и спецификацией HTML5. Имейте в виду, однако, что на самом деле не имеет значения элемент link в элементе noscript где-либо вне заголовка страницы. Но опять же, это, вероятно, случай производительности над соблюдением стандартов.