自定义元素 getter/setter 在模块内部时不起作用

Custom Element getter/setter not working when inside module

我的自定义元素有问题,我无法使 getter 和 setter 在模块内工作。

<head>
    <script type="module">
        class Foo extends HTMLElement {
            get prop() {
                alert('get called')
                return 'somevalue'
            }

            set prop(value) {
                alert('set called');
                this._prop = value;
            }
        }
        customElements.define('foo-elem', Foo);
    </script>
</head>
<body>
    <foo-elem></foo-elem>
    <script>
        let foo = document.querySelector('foo-elem');
        foo.prop = 2; // <- this does not trigger the setter
    </script>
</body>

当我从脚本中删除 type="module" 时,一切正常。有没有一种方法可以导入(es6 导入),这样我就可以在单独的文件中声明每个组件?

这是一个与您的脚本加载顺序相关的问题。

带有 type=module 的脚本默认为 defer - 这意味着它们仅在文档完成解析时执行。

您的其他普通 script 标记不是 defer,因此它会在遇到它时执行 - 因此它会在您定义自定义元素及其 getters/setters 之前首先执行。一旦浏览器到达文档末尾,module 脚本就会在之后执行。

defer 脚本会按照它们出现的顺序执行。因此,如果您制作第二个脚本 defer - 通过添加 defer 属性,或将其设为 type="module",那么 getters/setters 将按预期工作。