#html #tags
#HTML #Теги
Вопрос:
Как я могу создать пользовательские мета-теги для HTML со специальными атрибутами и поведением?
Комментарии:
1. Не знаю, можете ли вы сделать это в чистом HTML, но, возможно, вы можете использовать XHTML, в части XML есть пользовательские теги, созданные вами
Ответ №1:
В зависимости от того, что вы подразумеваете под «особыми атрибутами и поведением», вы можете «создавать» пользовательские HTML-теги прямо сейчас. Следующее отображается во всех браузерах и даже работает с различными методами JavaScript:
<my-book data-pages="400" data-author="Nietzsche">The Wanderer and His Shadow</my-book>
Есть всего пара вещей, которые вы должны иметь в виду:
-
Перенос! Пользовательские элементы должны состоять хотя бы из одного
-
likemy-book
илиapp-menu
илиheader-title
и т.д. Просто не используйте,data-*
поскольку он зарезервирован для атрибутов данных. -
По умолчанию все пользовательские элементы отображаются как
inline
. Однако вы можете изменить это с помощью CSS или JavaScript. -
Internet Explorer не распознает ни один из этих элементов, если вы сначала не «создадите» их с помощью JavaScript:
document.createElement('my-book');
Итак, вам нужно сделать это, прежде чем вы сможете использовать их в вашем CSS, HTML или JavaScript.
Комментарии:
1. Я собирался создать тег <hasjs>, который был скрыт для пользователей с отключенным js, но теперь я должен сначала зарегистрировать его с помощью JavaScript. Думаю, мне придется придерживаться <div class=»hasjs»>.
2. @apokaliptis проблема с отключением js возможно, вы можете использовать <noscript> свой обычный html для браузеров без поддержки js</noscript>
3. Было бы неплохо включить некоторые ссылки для этого ответа.
Ответ №2:
Есть интересная и подробная статья от HTML5Rocks.com о том, как работать с пользовательскими элементами: Пользовательские элементы: определение новых элементов в HTML
Вот выдержка из статьи о том, как это сделать.
Создание экземпляров элементов
Общие методы создания элементов по-прежнему применимы к пользовательским элементам. Как и в случае с любым стандартным элементом, они могут быть объявлены в HTML или созданы в DOM с использованием JavaScript. Создание пользовательских тегов
Объявите их:
<x-foo></x-foo>
Создайте DOM в JS:
var xFoo = document.createElement('x-foo');
xFoo.addEventListener('click', function(e) {
alert('Thanks!');
});
Используйте оператор new:
var xFoo = new XFoo();
document.body.appendChild(xFoo);
Комментарии:
1. Стоит отметить, что это правильный способ сделать это с точки зрения стандартов и поддержки браузера.
foo-bar
всегда следует использовать для имен пользовательских тегов (требуется дефис,x-
это распространенное явление) иdata-foo
всегда следует использовать для пользовательских атрибутов (data-
обязательно). Браузеры могут хорошо обрабатывать произвольные теги, подобныеfoo
, а могут и нет. Обычно они не вызывают ошибок, но это совершенно нестандартно и может вызвать проблемы в некоторых ситуациях. Также обратите внимание, что контент, отличный от HTML5, должен использовать нестрогий doctype при выполнении этого. JS можно использовать для обхода ограничения атрибута «data-«, но это неуклюже.2. Обновленная спецификация для пользовательских элементов версии v1: Повторно используемые веб-компоненты developers.google.com/web/fundamentals/getting-started/primers /…
Ответ №3:
Все, что вам действительно нужно сделать, это определить содержимое CSS для этого тега.
Пример:
mytag {
font-weight: bold;
}
И теперь mytag выделен вашим собственным жирным шрифтом:
<mytag>This text is in bold</mytag>
Комментарии:
1. Я знаю, что это, по крайней мере, работает для Google Chrome 47
2. Уверен, что это работает в chrome 47, но это не рекомендуется, поскольку это просто недопустимый HTML. Chrome может обрабатывать широкий спектр недопустимого кода, и хотя он работает , вам действительно не следует слишком полагаться на это, поскольку его поведение в других браузерах может быть совершенно произвольным.
3. @vrugtehagel Это звучит ужасно похоже на IE 90-х и 2000-х годов. Отклоняясь от стандартов и заставляя людей полагаться на причуды. «Вы должны использовать IE» => «Вы должны использовать Chrome». Не очень хорошая вещь.
Ответ №4:
В настоящее время появляется стандартная спецификация W3C, называемая Пользовательские элементы веб-компонента, которая позволяет разработчикам создавать свои собственные пользовательские HTML-элементы и регистрировать их в анализаторе браузера.
Mozilla разработала библиотеку под названием X-Tag, которая упрощает процесс создания пользовательских элементов и работы с ними, ознакомьтесь с ней:X-Tags.org
Ответ №5:
Существует также версия, которая поддерживается только в Chrome 54 и Opera.
Пример:
class BasicElement extends HTMLElement {
connectedCallback() {
this.textContent = 'Just a basic custom element.';
}
}
customElements.define('basic-element', BasicElement);
Вы можете узнать больше об этом здесь.
Комментарии:
1. Теперь это работает и в Safari: caniuse.com/#search=custom elements v1
2. Приятно знать, приятель, спасибо.
3. И в Firefox тоже
Ответ №6:
Вы можете создать пользовательские HTML-теги, выполнив следующие действия:
Шаг 1 — Зарегистрируйте новый элемент. Пользовательские элементы создаются с помощью document.registerElement():
var XFoo = document.registerElement('x-foo', {
prototype: Object.create(HTMLElement.prototype)
});
Второй аргумент в registerElement является необязательным объектом, который описывает прототип элемента.
Шаг 2 — Создание пользовательских тегов
Для этого есть несколько способов:
Объявите их:
<x-foo></x-foo>
Создать DOM в JavaScript:
var xFoo = document.createElement('x-foo');
xFoo.addEventListener('click', function(e) {
alert('Thanks!');
});
Используйте оператор new:
var xFoo = new XFoo();
Шаг 3 — Прикрепите вновь созданный элемент к документу
document.body.appendChild(new XFoo());
Полный пример:
var XFooProto = Object.create(HTMLElement.prototype);
// 1. Give x-foo a foo() method.
XFooProto.foo = function() {
alert('foo() called');
};
// 2. Define a property read-only "bar".
Object.defineProperty(XFooProto, "bar", {value: 5});
// 3. Register x-foo's definition.
var XFoo = document.registerElement('x-foo', {prototype: XFooProto});
// 4. Instantiate an x-foo.
var xfoo = document.createElement('x-foo');
// 5. Add it to the page.
document.body.appendChild(xfoo);
Комментарии:
1. У меня это не работает.
2. Ошибка типа: document.registerElement не является функцией. (В ‘document.registerElement()’ параметр ‘document.registerElement’ не определен)
3. Предупреждение: document.registerElement() устарел в пользу customElements.define(). Источник MDN