После решений Google и Mozilla для веб-компонентов теперь настала очередь Microsoft войти в это пространство со своим публичным выпуском библиотеки X-Tag . Официальный сайт определяет это следующим образом:
X-Tag — это поддерживаемая Microsoft библиотека JavaScript с открытым исходным кодом, которая объединяет семейство API-интерфейсов стандартных веб-компонентов W3C, предоставляя компактный многофункциональный интерфейс для быстрой разработки компонентов. Хотя X-Tag предлагает функциональные хуки для всех API веб-компонентов (пользовательских элементов, теневого DOM, шаблонов и импорта HTML), для работы ему требуется только поддержка пользовательских элементов. В отсутствие собственной поддержки пользовательских элементов X-Tag использует набор полифилов, совместно используемых с каркасом Polymer от Google.
Другими словами, X-Tag для Microsoft — это то же самое, что Polymer для Google . Единственное, что является общим для них обоих, — это базовый полифилл, который обеспечивает поддержку веб-компонентов в неподдерживаемых браузерах.
Чем X-Tag отличается от полимера?
Polymer объединяет все четыре технологии веб-компонентов, а именно: импорт HTML , пользовательские элементы , Shadow DOM и шаблоны HTML в одном пакете. Он предоставляет разработчику простой в использовании API для создания пользовательских веб-компонентов. С другой стороны, X-Tag предоставляет только API пользовательских элементов для создания пользовательских веб-компонентов. Конечно, вы также можете использовать другие API веб-компонентов вместе с библиотекой X-Tag.
Разве X-Tag не является проектом Mozilla?
Да, это было, но это больше не так. Немного покопавшись, мне удалось выяснить, что первоначальный разработчик проекта X-Tag Даниэль Бухнер когда-то работал в Mozilla, когда создавал библиотеку. Но с тех пор он перешел в Microsoft и продолжил проект. Кроме того, он был единственным вкладчиком в библиотеку с помощью бывшего Mozillian. Следовательно, теперь это проект, поддерживаемый Microsoft, основанный бывшим Mozillian.
Начало работы с X-Tag
В этой статье мы создадим пользовательский элемент с использованием библиотеки X-Tag для встраивания вида улиц карты Google с использованием следующей разметки:
<google-map latitude="40.7553231" longitude="-73.9752458"></google-map>
Пользовательский элемент <google-map>
будет иметь два атрибута, latitude
и longitude
, чтобы указать координаты местоположения. Поскольку эти атрибуты являются необязательными, мы также назначим значения по умолчанию для каждого из них на случай, если разработчик не сможет определить их в разметке.
Давайте начнем с включения библиотеки JavaScript X-Tag в <head>
нашего документа.
<!DOCTYPE html> <html> <head> <!-- X-Tag library including the polyfill --> <script src="https://rawgit.com/x-tag/core/master/dist/x-tag-core.min.js"></script> </head> <body> <!-- Custom element markup will appear here --> <script> <!-- The behavior of the custom element will be defined here --> </script> </body> </html>
Важно включить библиотеку X-Tag в
<head>
документа. Это делается для того, чтобы он был загружен и полностью проанализирован до того, как механизм рендеринга обнаружит пользовательскую разметку элемента, которую мы будем использовать внутри<body>
.
Определение пользовательского элемента
В отличие от Polymer, процесс создания пользовательского элемента с помощью X-Tag полностью основан на JavaScript. Библиотека X-Tag предоставляет кучу полезных методов, обратных вызовов и свойств для определения пользовательского поведения для нашего элемента. Типичный скелет для создания пользовательского элемента с X-Tag выглядит следующим образом:
xtag.register('google-map', { content: '', lifecycle: { created : function(){ /* Called when the custom element is created */ }, inserted : function(){ /* Called when the custom element is inserted into the DOM */ }, removed : function(){ /* Called when the custom element is removed from the DOM */ }, attributeChanged: function(attrName, oldValue, newValue){ /* Called when the attribute of the custom element is changed */ } }, accessors : {}, methods : {}, events : {} });
-
register()
— это самый важный метод в библиотеке. Он принимает имя пользовательского элемента в качестве первого аргумента, за которым следует определение объекта. Как следует из названия, это отвечает за регистрацию пользовательского элемента в DOM. -
content
— довольно часто, пользовательскому элементу может потребоваться дополнительная разметка для структуры или представления. Это принимает строку HTML или строку многострочного комментария для вставки разметки в DOM. -
lifecycle
— содержит полезные методы обратного вызова, предназначенные для различных этапов жизненного цикла пользовательского элемента. -
accessors
— предоставляет общий интерфейс для доступа к атрибутам объекта, установщикам и получателям и связывает их с соответствующими атрибутами HTML. Когда атрибуты связаны с получателем / установщиком, их состояния всегда остаются синхронизированными. -
methods
— пользовательскому элементу, вероятно, потребуются некоторые собственные уникальные методы для обеспечения желаемой функциональности. Просто добавьте объектmethods
объекту определенияxtag.register()
верхнего уровня иxtag.register()
все определяемые пользователем методы. -
events
— Это ответственно за присоединение событий к пользовательскому элементу. Ключи этого объекта — это имена событий, которые вы хотите прикрепить к пользовательскому элементу, например,tap
,focus
и т. Д.
Основная идея заключается в том, чтобы встроить карту Google с помощью iframe и указать URL-адрес src
в следующем формате:
https://www.google.com/maps/embed/v1/streetview?key=<API_KEY>&location=<LATITUDE>,<LONGITUDE>
Чтобы получить API_KEY
, выполните шаги, описанные здесь . Как только вы получите API_KEY
, мы создадим iframe
внутри created
метода обратного вызова объекта жизненного цикла и определим свойство src
в указанном выше формате.
// Insert your API key here var API_KEY = <API_KEY>; xtag.register('google-map', { lifecycle: { created: function() { var iframe = document.createElement('iframe'); iframe.width = 600; iframe.height = 600; iframe.frameBorder = 0; iframe.src = 'https://www.google.com/maps/embed/v1/streetview?key=' + API_KEY + '&location=40.7553231,35.3434'; this.appendChild(iframe); } } });
Приведенный выше код работает, но нам нужно избавиться от жестко закодированных значений координат в iframe.src
и вместо этого iframe.src
значения непосредственно из атрибутов пользовательских элементов. Для этого мы будем использовать объект accessors
с именами атрибутов, формирующих ключи. Мы связываем их с атрибутами HTML, объявляя attributes: {}
.
accessors: { latitude: { attribute: {}, set: function(value) { this.xtag.data.latitude = value; }, get: function() { return this.getAttribute('latitude') || "40.7553231"; // Default value } }, longitude: { attribute: {}, set: function(value) { this.xtag.data.longitude = value; }, get: function() { return this.getAttribute('longitude') || "-73.9752458"; // Default value } } }
Затем мы можем использовать эти переменные напрямую, указав URL-адрес src
:
iframe.src = 'https://www.google.com/maps/embed/v1/streetview?key=' + API_KEY+'&location=' + this.latitude+',' + this.longitude;
Применяя последние штрихи
Стилизация пользовательского элемента аналогична стилизации любого другого тега HTML. Классы, идентификаторы и селекторы атрибутов работают должным образом с пользовательскими элементами. Например, мы добавим box-shadow
и border-radius
в наш недавно созданный пользовательский элемент <google-map>
.
google-map { display: inline-block; box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); padding: 1em; border-radius: .25em; }
Использовать пользовательский элемент теперь так же просто, как включить следующую разметку в <body>
:
<!-- Use the custom element --> <google-map latitude="40.7553231" longitude="-73.9752458"></google-map>
Конечный результат виден в CodePen ниже:
Хотя поддержка браузеров для веб-компонентов немного поверхностна , наша демонстрация с использованием библиотеки X-Tag с полифилом должна работать во всех современных браузерах, включая IE9 и выше.
Последние мысли
По сравнению с Polymer, X-Tag предоставляет гораздо более простой API для понимания и реализации пользовательских элементов, в основном из-за отсутствия сложных функций, которыми обладает Polymer. Если вы намерены сохранять свою настройку легкой и гибкой, и у вас нет подходящего варианта использования для других API-интерфейсов веб-компонентов, то X-Tag наверняка будет подходящим кандидатом для этой работы.