【问题标题】:Extending <option>扩展 <选项>
【发布时间】:2017-01-28 16:40:59
【问题描述】:

我正在尝试扩展HTMLOptionElement,

<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?

未捕获的 InvalidStateError:无法在“元素”上执行“createShadowRoot”:无法在已托管用户代理影子树的主机上创建影子根。

我从未见过这个错误,我认为它可以让你附加多个影子根。为什么会这样?有没有办法让它发挥作用?

【问题讨论】:

    标签: javascript html shadow-dom custom-element


    【解决方案1】:

    你是对的:可以附加多个影子根。

    ...但是这种可能性来自 Chrome 的was removed 以符合新版本的 Shadow DOM 规范 (v1),该规范现在与其他浏览器供应商(Mozilla、Microsoft、Apple)共享。

    这就是您以前从未见过此错误的原因。是added to the Living Standard:

    1. 如果上下文对象是影子主机,则抛出 InvalidStateError。

    作为一种解决方法,您必须不使用 Shadow DOM,或者创建不扩展 &lt;option&gt; 元素的新自定义元素。

    【讨论】:

    • 这是否意味着我现在只能在自定义元素上附加一个新的影子 DOM,因为许多原生元素都有自己的用户代理影子 DOM?
    • 是的,很遗憾 :( 工作组在这里讨论过:github.com/w3c/webcomponents/issues/110 和 /102。
    • 那太糟糕了。还是谢谢。
    • 是的。我们可以希望,在未来的版本中,聪明的供应商将删除他们的用户代理影子树,让我们免于添加我们的影子树。
    • 那很好,但我不确定他们将如何在没有预定义阴影树的情况下实现某些功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 2011-08-14
    • 2013-11-06
    相关资源
    最近更新 更多