Создать и использовать пользовательский компонент HTML?

У меня есть следующий местный HTML:

<html>

<head>
  <link rel="import" href="https://mygithub.github.io/webcomponent/">
</head>

<body>
  <!-- This is the custom html component I attempted to create -->
  <img-slider></img-slider>
</body>

</html>

и следующая попытка шаблона:

<template>
  <style>
      .redColor{
        background-color:red;
      }
  </style>
  <div class = "redColor">The sky is blue</div>
</template>

<script>
  // Grab our template full of slider markup and styles
  var tmpl = document.querySelector('template');

  // Create a prototype for a new element that extends HTMLElement
  var ImgSliderProto = Object.create(HTMLElement.prototype);

  // Setup our Shadow DOM and clone the template
  ImgSliderProto.createdCallback = function() {
    var root = this.createShadowRoot();
    root.appendChild(document.importNode(tmpl.content, true));
  };

  // Register our new element
  var ImgSlider = document.registerElement('img-slider', {
    prototype: ImgSliderProto
  });
</script>

Как описано в этой статье. Когда я запускаю код, я получаю:

Uncaught TypeError: Невозможно прочитать свойство 'content' с нулевым значением в HTMLElement.ImgSliderProto.createdCallback ((index):20)

Другими словами document.querySelector('template'); возвращает ноль. Что дает?

Моя цель - создать собственный HTML-элемент и отобразить его на веб-сайте, который ссылается на код шаблона. Я на 100% уверен, что правильно извлекаю код удаленного шаблона (очевидно, так как я получаю ошибку в этом коде).

PS Я использую последнюю версию Chrome, поэтому мне не нужны полифилы.

1 ответ

Решение

Попробуй это:

  var tmpl = (document.currentScript||document._currentScript).ownerDocument.querySelector('template');

Проблема, с которой вы столкнулись, состоит в том, что шаблон на самом деле не является частью document но это часть currentScript, Из-за различий между браузерами и полифилов вам нужно проверить currentScript а также _currentScript работать правильно.

Также помните, что HTML-импорт никогда не будет полностью кросс-браузерным. Большинство веб-компонентов переходят на код на основе JavaScript и будут загружаться с использованием загрузки модуля ES6.

Есть вещи, которые помогают создавать шаблоны в файлах JS. Использование обратного ключа (`) является разумным способом:

var tmpl = document.createElement('template');
tmpl.innerHTML = `<style>
  .redColor{
    background-color:red;
  }
</style>
<div class = "redColor">The sky is blue</div>`;
Другие вопросы по тегам