我制作了一个自定义的内置元素,它递归地调用自己.但是,在JavaScript中生成的子元素不是从自定义内置元素继承的.考虑到HTML的初始调用运行正常,我怀疑问题可能源于通过JavaScript添加控件时的页面生命周期.有没有想过为什么会发生这种情况?

HTML

<!DOCTYPE HTML>
<HTML lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <ul is="test-list" id="testList">

    </ul>
    <script type="module" src="/js/Test-list-element.js"></script>

    <script>
        let data = [
            {
                name: 'a',
                data: [{
                    name: 'a',
                    data: []
                },
                {
                    name: 'b',
                    data: []
                },
                {
                    name: 'c',
                    data: []
                },
                {
                    name: 'd',
                    data: []
                }]
            },
            {
                name: 'b',
                data: [{
                    name: 'a',
                    data: []
                },
                {
                    name: 'b',
                    data: []
                },
                {
                    name: 'c',
                    data: []
                },
                {
                    name: 'd',
                    data: []
                }]
            },
            {
                name: 'c',
                data: [{
                    name: 'a',
                    data: []
                },
                {
                    name: 'b',
                    data: []
                },
                {
                    name: 'c',
                    data: []
                },
                {
                    name: 'd',
                    data: []
                }]
            },
            {
                name: 'd',
                data: [{
                    name: 'a',
                    data: []
                },
                {
                    name: 'b',
                    data: []
                },
                {
                    name: 'c',
                    data: []
                },
                {
                    name: 'd',
                    data: []
                }]
            },
        ];

        window.onload = (event) => {
            let listElement = document.getElementById("testList");
            listElement.data = data;
        }
    </script>

</body>

</HTML>

Test-list-element.js

class testList extends HTMLUListElement {
    constructor() {
      super();
      this.render = this.render.bind(this);
    }
  
    #data = null;
    set data(value) {
      this.#data = value;
      this.render();
    }

    render(){
        if(!this.#data) return;

        this.#data.forEach(element => {
            let newItem = document.createElement('li');
            newItem.innerText = element.name;
            this.appendChild(newItem);

            if(element.data)
            {
                let newlist = document.createElement('ul');
                newlist.setAttribute('is','test-list')            
                newlist.data = data;
                newItem.appendChild(newlist);
            }
        });
    }
}

    
customElements.define('test-list', testList, { extends: 'ul' });
  

enter image description here

推荐答案

不要使用

const newlist = document.createElement('ul');
newlist.setAttribute('is','test-list');

来创建元素.实例化自定义元素的正确方法是the createElement options parameter

const newlist = document.createElement('ul', {is: 'test-list'});

或者只是构造函数本身:

const newlist = new TestList();

Javascript相关问答推荐

不渲染具有HTML参数的React元素

用相器进行向内碰撞检测

我的glb文件没有加载到我的three.js文件中

获取表格的左滚动位置

D3多线图显示1线而不是3线

确定MutationRecord中removedNodes的索引

Vue:ref不会创建react 性属性

使用AJX发送表单后,$_Post看起来为空

Bootstrap动态选项卡在切换选项卡后保持活动状态,导致元素堆叠

. NET中Unix时间转换为日期时间的奇怪行为

点击按钮一次有文本出现和褪色,而不是点击两次?(html,CSS,JavaScript)

用于编辑CSS样式的Java脚本

这个值总是返回未定义的-Reaction

变量在导入到Vite中的另一个js文件时成为常量.

如何在我的Next.js项目中.blob()我的图像文件?

try 将Redux工具包与MUI ToggleButtonGroup组件一起使用时出错

如何在Firebase中读取对象的特定字段?

REACT-本机错误:错误类型错误:无法读取未定义的容器的属性

递归地将JSON对象的内容上移一级

react :图表负片区域不同 colored颜色