2016-09-20 6 views
3

Я пытаюсь продлить HTMLOptionElement,Расширение <option>

<template id="cOptionTemplate"> 
    <content></content> 
</template> 

<select> 
    <option is="custom-option">Test</option> 
</select> 
var cOption = document.registerElement('custom-option', { 
    prototype: Object.create(HTMLOptionElement.prototype, { 
     createdCallback: { 
      value: function() { 
       var template = document.getElementById("cOptionTemplate") 
       var clone = document.importNode(template.content, true); 
       this.createShadowRoot().appendChild(clone); 
      } 
     }, 
     attributeChangedCallback: { 
      value: function (attrName, oldVal, newVal){ 
       switch(attrName){ 
        case "attr1": 
         console.log(this); 
       } 
      } 
     } 
    }), 
    extends: "option" 
}); 

Вот a demo кода.

но очевидно, что это не работает, поскольку у него уже есть агент пользователя shadowRoot?

Uncaught InvalidStateError: Failed to execute 'createShadowRoot' on 'Element': Shadow root cannot be created on a host which already hosts an user-agent shadow tree.

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

ответ

5

Вы были правы: можно было прикрепить несколько теневых корней.

... Но эта возможность was removed из Chrome соответствует новой версии спецификации Shadow DOM (v1), которая теперь предоставляется совместно с другими поставщиками браузеров (Mozilla, Microsoft, Apple).

Вот почему вы никогда не видели эту ошибку раньше. Это было added to the Living Standard:

  1. If context object is a shadow host, then throw an InvalidStateError.

В качестве обходного пути, вы должны не использовать Shadow DOM, или создать новый пользовательский элемент, который не расширяет <option> элемента.

+0

Означает ли это, что теперь я могу только прикрепить новую теневую DOM к пользовательским элементам, потому что у многих собственных элементов есть собственный пользовательский агент shadow DOM? –

+0

Да, к сожалению :(Об этом говорила рабочая группа: https://github.com/w3c/webcomponents/issues/110 и/102. – Supersharp

+0

Ну что ж, все равно спасибо. –