You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript动态注入的Materialize Modal无法弹出问题求助

问题原因
  • 初始化时机错误:DOMContentLoaded事件仅在页面初始静态DOM加载完成时触发,此时异步fetch请求尚未完成,动态生成的Modal元素还未插入DOM,初始化逻辑仅能识别到静态硬编码的Modal,后续注入的Modal未被初始化因此无法弹出。
  • 代码细节问题:原JS代码中的html变量未声明,会默认挂载为全局变量,可能引发变量污染。
修复方案

将Modal初始化逻辑移动到fetch请求完成、动态HTML插入DOM之后执行即可,修改后的JS代码如下:

const content = document.querySelector('.row');
fetch('./perTab.json')
    .then((response) => {
        console.log(response, 'resolved');
        return response.json();
    }).then(data => {
        // 补充声明html变量
        let html = ``;
        console.log(data);
        data.forEach((element, index) => {
            html += `
            <!-- Modal Trigger -->
            <a class="waves-effect waves-light btn modal-trigger" href="#modal${index + 2}">${element.Name}</a>
    
            <!-- Modal Structure -->
            <div id="modal${index + 2}" class="modal bottom-sheet">
                <div class="modal-content">
                    <h4>h4</h4>
                    <p>A bunch of text</p>
                </div>
                <div class="modal-footer">
                    <a href="#!" class="modal-close waves-effect waves-green btn-flat">Agree</a>
                </div>
            </div>
            `;
        });
        content.innerHTML = html;
        // 动态内容插入完成后初始化所有Modal
        const elems = document.querySelectorAll('.modal');
        const instances = M.Modal.init(elems);
    }).catch((error) => {
        console.log(error, ' broke the promise')
    })

// 原有DOMContentLoaded初始化逻辑可以保留,重复调用init不会影响已初始化的Modal
document.addEventListener('DOMContentLoaded', () => {
    const elems = document.querySelectorAll('.modal');
    const instances = M.Modal.init(elems);
});

内容的提问来源于stack exchange,提问作者CodeMonkey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:24:08