Допустимы ли пользовательские элементы HTML5? - PullRequest
167 голосов
/ 23 марта 2012

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

<greeting>Hello!</greeting>

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

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

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

Ответы [ 11 ]

159 голосов
/ 23 марта 2012

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

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

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

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

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

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

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

19 голосов
/ 17 октября 2012

Возможно и разрешено:

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

http://www.w3.org/TR/html5/infrastructure.html#extensibility-0

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

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

15 голосов
/ 24 марта 2012

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

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

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

Элемент body может содержать только Содержимое потока , где содержимое потока равноопределяется как элементы: a, abbr, address, area (если это потомок элемента карты), article, кроме, audio, b, bdi, bdo, blockquote, br, button, canvas, cite, codeкоманда, datalist, 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, script, section, select, select,small, span, strong, style (при наличии атрибута scoped), sub, sup, svg, table, textarea, время, u, ul, var, video, wbr и Text

и так далее.

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

10 голосов
/ 24 января 2016

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

Пользовательские элементы и атрибуты действительны в 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

9 голосов
/ 03 августа 2016

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

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

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

5 голосов
/ 15 октября 2012

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

3 голосов
/ 06 января 2017

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

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

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

<my-element>

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

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

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

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

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

3 голосов
/ 17 июля 2013

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

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

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

* * 1010

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

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

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

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

Для более подробного ознакомления с предметом прочитайте Введение в веб-компоненты , в котором также содержится информация о 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 - более поздние версии работают совсем по-другому. Однако, так как спецификация все еще находится в разработке, я бы не рекомендовал использовать ее в производственном коде.

1 голос
/ 03 ноября 2014

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

<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). Все, что вам нужно, это просто буквенный символ (a-z, A-Z), чтобы начать тег, а затем вы можете использовать любой из не буквенных символов. Если в CSS вы должны использовать «\» (обратную косую черту), чтобы найти элемент, например, потребуется Query \ ^ {...}. Но в JS вы просто называете это так, как видите. Я надеюсь, что это поможет. Смотрите пример здесь

- норка CBOS

1 голос
/ 17 июля 2013

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

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