Экземпляр Webcomponent / custom-element прекращает анализ первого тега <script>

Используя Google Chrome (v42) и встроенную поддержку веб-компонентов, я пытаюсь использовать пользовательский элемент, где содержимое пользовательского элемента иногда содержит встроенные теги javascript. Тем не менее, парсер, кажется, перестает анализировать содержимое элемента всякий раз, когда он встречает первый <script> тег. Что я делаю неправильно? Как я могу убедиться, что мой пользовательский элемент знает весь его контент, когда запускается инициализатор (например, madeCallback)?

Упрощенный пример:

<html>
  <body>
    <script>
      document.registerElement("element-count", {
        prototype: Object.create(HTMLElement.prototype, {
          createdCallback: {
            value: function(){
              this.appendChild(document.createTextNode(this.children.length));
            }
          }
        })
      })
    </script>

    <element-count>
      <div>alpha</div>
      <script></script><!-- this is here just to show that the parser stops -->
      <div>beta</div>
    </element-count>
  </body>
</html>

Ожидаемый результат:

alpha
beta
3

Фактический результат:

alpha
2
beta

CreateCallback пользовательского элемента запускается, как только синтаксический анализатор обнаруживает <script> элемент.

У меня нет большого контроля над фрагментом документа в пользовательском элементе (внутри <element-count>). Реальная версия пользовательского компонента пытается обернуть произвольные фрагменты DOM в богато украшенные коробки и делать другие вещи.

1 ответ

Вы правы, потому что пользовательский элемент еще не анализируется, когда createdCallback называется.

Использовать body.onload событие. Или поставить скрипт, который вызывает registerElement после пользовательского элемента.

<html>
<body onload="register()">
    <script>
    function register()
    {
        document.registerElement( "element-count", {
            prototype: Object.create( HTMLElement.prototype, {
                createdCallback: {
                    value: function ()
                    {
                        this.appendChild( document.createTextNode( this.children.length ) );
                    }
                }
            } )
        } )
    }
   </script>
   <element-count id="c">
        <script></script><!-- this is here just to show that the parser stops --> 
        <div>alpha</div>
        <div>beta</div>
    </element-count>

<button onclick="alert(c.children.length)">Recount</button>

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