Допустимы ли пользовательские элементы HTML5?

Мне не удалось найти однозначного ответа на вопрос, являются ли пользовательские теги действительными в HTML5, например:

<greeting>Hello!</greeting>

Я ничего не нашел в спецификации так или иначе:

http://dev.w3.org/html5/spec/single-page.html

А пользовательские теги, похоже, не проверяются с помощью валидатора W3C.

11 ответов

Решение

Спецификация пользовательских элементов доступна в Chrome и Opera и становится доступной в других браузерах. Он предоставляет средства для регистрации пользовательских элементов формальным образом.

Пользовательские элементы - это новые типы элементов DOM, которые могут быть определены авторами. В отличие от декораторов, которые не имеют состояния и эфемерны, пользовательские элементы могут инкапсулировать состояние и предоставлять интерфейсы сценариев.

Пользовательские элементы являются частью более широкой спецификации W3, называемой веб-компонентами, наряду с шаблонами, импортом HTML и Shadow DOM.

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

Однако из этой превосходной статьи о разработчиках Google о пользовательских элементах v1:

Имя пользовательского элемента должно содержать тире (-). Так <x-tags>, <my-element>, а также <my-awesome-app> все действительные имена, в то время как <tabs> а также <foo_bar> не. Это требование заключается в том, что анализатор HTML может отличать пользовательские элементы от обычных элементов. Это также обеспечивает прямую совместимость при добавлении новых тегов в HTML.

Некоторые ресурсы

Это возможно и разрешено:

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

http://www.w3.org/TR/html5/infrastructure.html

Но если вы намереваетесь добавить интерактивность, вам нужно будет сделать ваш документ недействительным (но все же полностью функциональным), чтобы соответствовать IE 7 и 8.

См. http://blog.svidgen.com/2012/10/building-custom-xhtml5-tags.html (мой блог)

Это на самом деле является следствием накопления контентной модели элементов.

Например, корневой элемент должен быть html элемент.

html элемент может содержать только элемент head, за которым следует элемент body.

body элемент может содержать только содержимое потока, где содержимое потока определяется как элементы: a, abbr, address, area (если он является потомком элемента карты), article, кроме аудио, b, bdi, bdo, blockquote, br, кнопка, холст, цитировать, код, команда, список данных, del, подробности, dfn, div dl, em, embed, fieldset, рисунок, нижний колонтитул, форма, h1, h2, h3, h4, h5, h6, заголовок, hgroup, hr i, iframe, img, ввод, ins, kbd, keygen, метка, карта, метка, математика, меню, метр, nav, noscript, объект, ol, вывод, p, pre, прогресс, q, ruby, s, samp, сценарий, раздел, выбор, маленький, диапазон, сильный, стиль (если атрибут scoped присутствует), sub, sup, svg, таблица, textarea, время, u, ul, var, video, wbr и Text

и так далее.

Модель содержимого ни в коем случае не говорит "вы можете поместить в нее любые элементы, которые вам нравятся", что было бы необходимо для пользовательских элементов / тегов.

Основные пользовательские элементы и атрибуты

Пользовательские элементы и атрибуты действительны в HTML при условии, что:

  • Имена элементов строчные и начинаются с x-
  • Имена атрибутов строчные и начинаются с data-

Например, <x-foo data-bar="gaz"/> или же <br data-bar="gaz"/>,

Общее соглашение для элементов x-foo; x-vendor-feature Рекомендовано.

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

Расширенные пользовательские элементы и атрибуты

С 2014 года появился новый, значительно улучшенный способ регистрации пользовательских элементов и атрибутов. Он не будет работать в старых браузерах, таких как IE 9 или Chrome/Firefox 20. Но он позволяет использовать стандартный HTMLElement интерфейс, предотвращать столкновения, использовать неx-* и неdata-* имена и определить пользовательское поведение и синтаксис для браузера. Это требует немного причудливого JavaScript, как подробно описано в ссылках ниже.

HTML5 Rocks - Определение новых элементов в HTML
WebComponents.org - Введение в пользовательские элементы
W3C - Веб-компоненты: пользовательские элементы

Относительно обоснованности основного синтаксиса

С помощью data-* Имена пользовательских атрибутов в течение некоторого времени были совершенно допустимы и даже работают со старыми версиями HTML.

W3C - HTML5: расширяемость

Что касается пользовательских (незарегистрированных) имен элементов, W3C настоятельно рекомендует против них и считает их несоответствующими. Но браузеры обязаны их поддерживать, и x-* идентификаторы не будут конфликтовать с будущими спецификациями HTML и x-vendor-feature идентификаторы не будут конфликтовать с другими разработчиками. Пользовательский DTD может использоваться для работы с любыми требовательными браузерами.

Вот некоторые соответствующие выдержки из официальных документов:

"Применимые спецификации МОГУТ определять новое содержимое документа (например, элемент foobar) [...]. Если синтаксис и семантика данного соответствующего документа HTML5 не изменяются при использовании соответствующих спецификаций, то этот документ остается соответствующим HTML5 документ."

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

"Пользовательские агенты не могут свободно обрабатывать несогласованные документы по своему усмотрению; модель обработки, описанная в этой спецификации, применяется к реализациям независимо от соответствия входных документов".

"Интерфейс HTMLUnknownElement должен использоваться для элементов HTML, которые не определены в этой спецификации".

W3C - HTML5: Соответствующие документы
WhatWG - Стандарт HTML: Элементы DOM

Я хотел бы отметить, что слово "действительный" может иметь два различных значения в этом контексте, причем любое из них потенциально может быть действительным.

  1. Следует ли считать HTML-документ с пользовательскими тегами допустимым HTML5? Ответ на это явно "нет". В спецификации указано, какие именно теги допустимы в каких контекстах. Вот почему средство проверки HTML не будет принимать документ с пользовательскими тегами или со стандартными тегами в неправильных местах (например, тег "img" в заголовке).

  2. Будет ли HTML-документ с пользовательскими тегами обрабатываться и отображаться стандартным, четко определенным образом в браузерах? Здесь, пожалуй, удивительно, ответ "да". Даже если документ технически не будет считаться допустимым HTML5, спецификация HTML5 точно определяет, что браузеры должны делать, когда они видят пользовательский тег: короче говоря, пользовательский тег действует как <span> - это ничего не значит и ничего не делает по умолчанию, но он может быть стилизован под HTML и доступен через javascript.

Чтобы дать обновленный ответ, отражающий современные страницы.

Пользовательские теги действительны, если либо,

1) они содержат тире

<my-element>

2) Они встроены в XML

<greeting xmlns="http://example.com/customNamespace">Hello!</greeting>

Это предполагает, что вы используете тип документа HTML5 <!doctype html>

Учитывая эти простые ограничения, теперь имеет смысл сделать все возможное, чтобы ваша HTML-разметка была действительной (пожалуйста, прекратите закрывать такие теги, как <img> а также <hr>, это глупо и неправильно, если вы не используете тип документа XHTML, который вам, вероятно, не нужен).

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

Пользовательские элементы HTML - это новый стандарт W3, в который я внес вклад, который позволяет вам объявлять и регистрировать пользовательские элементы с помощью анализатора. Вы можете прочитать спецификацию здесь: Спецификация пользовательских элементов веб-компонентов W3. Кроме того, Microsoft поддерживает библиотеку (написанную бывшими разработчиками Mozilla), которая называется X-Tag - это делает работу с веб-компонентами еще проще.

Цитирование из раздела "Расширяемость" спецификации HTML5:

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

Поэтому, если вы используете сериализацию XML для HTML5, вы можете сделать что-то вроде этого:

<greeting xmlns="http://example.com/customNamespace">Hello!</greeting>

Однако, если вы используете синтаксис HTML, вы гораздо более ограничены в своих действиях.

Для функций уровня разметки, предназначенных для использования с синтаксисом HTML, расширения должны быть ограничены новыми атрибутами формы "x-vendor-feature" [...] Не следует создавать новые имена элементов.

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

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

Для более подробного ознакомления с предметом ознакомьтесь с разделом Введение в веб-компоненты, в котором также содержится информация о Shadow DOM и другие соответствующие спецификации. Эти спецификации все еще находятся на стадии разработки - вы можете видеть текущий статус здесь - но они активно развиваются.

В качестве примера, простое определение для greeting Элемент может выглядеть примерно так:

<element name="greeting">
  <template>
    <style scoped>
      span { color:gray; }
    </style>
    <span>Simon says:</span>
    <q><content/></q>
  </template>
</element>

Это говорит браузеру отображать содержимое элемента в кавычках и с префиксом текста "Саймон говорит:", который оформлен в сером цвете. Как правило, пользовательское определение элемента, подобное этому, будет храниться в отдельном html-файле, который вы импортируете со ссылкой.

<link rel="import" href="greeting-definition.html" />

Хотя вы также можете включить его, если хотите.

Я создал рабочую демонстрацию приведенного выше определения с использованием библиотеки Polymer Polyfill, которую вы можете увидеть здесь. Обратите внимание, что здесь используется старая версия библиотеки Polymer - более поздние версии работают совсем по-другому. Однако, так как спецификация все еще находится в разработке, я бы не рекомендовал использовать ее в производственном коде.

Просто используйте все, что хотите, без объявления dom

<container>content here</container>

добавьте свой стиль (display:block), и он будет работать с любым современным браузером

data-* атрибуты действительны в HTML5 и даже в HTML4 во всех веб-браузерах, которые их уважают. Добавление новых тегов технически нормально, но не рекомендуется только потому, что:

  1. Это может конфликтовать с чем-то, что добавлено в будущем, и
  2. Делает документ HTML недействительным, если он не добавлен динамически через JavaScript.

Я использую пользовательские теги только в тех местах, где Google это не волнует. Например, в игровом движке iframe я сделал <log> тег, содержащий <msg>, <error> а также <warning> - но только через JavaScript. И это было полностью в силе, по словам валидатора. Он даже работает в Internet Explorer со своим стилем!;]

Я знаю, что этот вопрос старый, но я изучал эту тему, и хотя некоторые из приведенных выше утверждений верны, они не являются единственным способом создания пользовательских элементов. Например:

<button id="find">click me</button>
<Query? ?attach="find" ?content="alert( find() );" ?prov="Hello there :D" >
I won't be displayed :D
</Query?>

<style type="text/css">

[\?content] {

display: none;

}

</style>

<script type="text/javascript">

S = document.getElementsByTagName("Query?")[0];

Q = S.getAttribute("?content");

A = document.getElementById( S.getAttribute("?attach") );

function find() {

  return S.getAttribute("?prov");

}

(function() {

A.setAttribute("onclick", Q);

})();

</script>

будет работать отлично (пока в новых версиях Google Chrome, IE, FireFox и мобильных Safari). Все, что вам нужно, это просто буквенный символ (az, AZ), чтобы начать тег, а затем вы можете использовать любой из не буквенных символов. Если в CSS вы должны использовать "\" (обратную косую черту), чтобы найти элемент, например, потребуется Query\^ { ... } . Но в JS вы просто называете это так, как видите. Я надеюсь, что это поможет. Смотрите пример здесь

-Минк CBOS

Пользовательские теги недопустимы в HTML5. Но в настоящее время браузеры поддерживают их анализ, а также вы можете использовать их с помощью CSS. Так что если вы хотите использовать пользовательские теги для текущих браузеров, тогда вы можете. Но поддержка может быть отменена, когда браузеры реализуют стандарты W3C строго для анализа содержимого HTML.

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