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

二次打开模态框出现Uncaught TypeError错误求助

问题分析与解决

首次点击图片时模态框可正常加载,但关闭后再次打开时触发报错:
Uncaught TypeError: Cannot read properties of null (reading 'appendChild')
错误出现在JavaScript代码中z==0时的carusel.appendChild(div)语句处。此前移除HTML中的foreach循环,改用@Model.FirstOrDefault().getNumeroEntrega()获取模型值后出现该问题。

相关代码

HTML部分

<div class="modal" tabindex="-1" id="myModal">
    <div class="modal-dialog" id="modalDialog">
        <div class="modal-content">
            <div class="modal-header" id="modalHeader">
                <button type="button" class="btn-close" id="btnClose" onclick="CloseModal()" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <div class="modal-body px-0" data-bs-interval="false" id="@Model.FirstOrDefault().getNumeroEntrega()">
                <div id="C_@Model.FirstOrDefault().getNumeroEntrega()" class="carousel slide carousel-dark" data-bs-interval="false">
                    <div id="Entrega_@Model.FirstOrDefault().getNumeroEntrega()" class="carousel-inner" data-bs-interval="false">
                        <!--Creacion del carousel con imagenes-->
                        <!--Fin del carousel-->
                        <button class="carousel-control-prev" type="button" data-bs-target="#C_@Model.FirstOrDefault().getNumeroEntrega()" data-bs-slide="prev">
                            <span class="carousel-control-prev-icon" aria-hidden="true"></span>
                            <span class="visually-hidden">Previous</span>
                        </button>
                        <button class="carousel-control-next" type="button" data-bs-target="#C_@Model.FirstOrDefault().getNumeroEntrega()" data-bs-slide="next">
                            <span class="carousel-control-next-icon" aria-hidden="true"></span>
                            <span class="visually-hidden">Next</span>
                        </button>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

JavaScript部分

var modal = document.getElementById("myModal"); 
while (z < result.length) {
    var carusel = document.getElementById("Entrega_" + entrega);
    if (z == 0) {
        var div = document.createElement('div');
        div.setAttribute('class', 'carousel-item active');
        let btn = document.createElement('button');
        btn.setAttribute('class', 'btn btn-primary mt-3');
        btn.textContent = "Descargar Imágen";
        let im = document.createElement('i');
        im.setAttribute('class', 'fa fa-download mx-2');
        btn.appendChild(im);
        div.appendChild(btn);
        var img = document.createElement("img");
        img.setAttribute('class', 'img-responsive img-fluid');
        img.setAttribute('id', "img01")
        div.appendChild(img);
        img.setAttribute('src', result[z].path);
        carusel.appendChild(div);
        z++;
    }
    else {
        var div = document.createElement('div');
        div.setAttribute('class', 'carousel-item');
        let btn = document.createElement('button');
        btn.setAttribute('class', 'btn btn-primary');
        btn.textContent = "Descargar Imágen";
        let im = document.createElement('i');
        im.setAttribute('class', 'fa fa-download mx-2');
        btn.appendChild(im);
        div.appendChild(btn);
        var img = document.createElement('img');
        img.setAttribute('class', 'img-responsive img-fluid');
        img.setAttribute('id', "img01")
        div.appendChild(img);
        img.setAttribute('src', result[z].path);
        carusel.appendChild(div);
        z++;
    }
}

//'X' button onclick function
function CloseModal() {
    let modal = document.getElementById('myModal');
    modal.style.display = "none";
    modal.remove();
}

问题根源

核心错误出在CloseModal函数中的modal.remove():这个操作会直接把整个模态框DOM元素从页面中彻底删除。第一次打开时DOM存在,能正常找到Entrega_xxx元素;但关闭后模态框被移除,第二次打开时页面已无对应DOM,自然找不到carusel元素,导致carusel为null,调用appendChild就触发报错。

另外,原代码中所有图片都用同一个id="img01",违反DOM唯一ID规范,也可能引发其他潜在问题。


解决方法

1. 修复模态框关闭逻辑(推荐)

不要移除模态框,只隐藏它,保留DOM结构供下次使用:

function CloseModal() {
    let modal = document.getElementById('myModal');
    // 用Bootstrap官方API隐藏模态框,更规范,会自动处理背景等状态
    const bootstrapModal = bootstrap.Modal.getInstance(modal);
    bootstrapModal.hide();
    
    // 若不想用Bootstrap API,也可以保留style隐藏,但不建议
    // modal.style.display = "none";
}

2. 优化JavaScript代码(减少冗余+修复ID重复)

合并重复逻辑,给图片设置唯一ID:

var modal = document.getElementById("myModal"); 
while (z < result.length) {
    var carusel = document.getElementById("Entrega_" + entrega);
    // 提前判断元素是否存在,避免报错
    if (!carusel) break;
    
    var div = document.createElement('div');
    // 合并类名判断
    div.className = z === 0 ? 'carousel-item active' : 'carousel-item';
    
    let btn = document.createElement('button');
    btn.className = z === 0 ? 'btn btn-primary mt-3' : 'btn btn-primary';
    btn.textContent = "Descargar Imágen";
    
    let im = document.createElement('i');
    im.className = 'fa fa-download mx-2';
    btn.appendChild(im);
    div.appendChild(btn);
    
    var img = document.createElement("img");
    img.className = 'img-responsive img-fluid';
    // 设置唯一ID,避免重复
    img.id = `img01_${z}`;
    img.src = result[z].path;
    div.appendChild(img);
    
    carusel.appendChild(div);
    z++;
}

3. 确认ID匹配

确保JavaScript中的entrega变量值,与HTML中@Model.FirstOrDefault().getNumeroEntrega()生成的数值完全一致,否则也会出现找不到carusel元素的情况。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:25:19