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

如何操作通过Fetch动态插入到页面中的HTML元素?

问题:如何操作动态插入的HTML元素?

我有一个带菜单的HTML页面,点击菜单选项时不会跳转页面,而是通过Fetch将目标HTML内容插入到主页面id为teste的section标签中。但尝试操作插入的HTML(比如表单)时,页面初始加载时的选择器只能读取主页面内容,无法获取动态插入的元素,导致操作失效。

相关代码如下:

<!DOCTYPE html>
<html lang="en" id="background">

<head>
    <title>METRO PROJECT</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>
    <header>
        <nav>
            <div id="">
                <a href="https://google.com.br"><img src="images/metroLogo.png" width=9%></a>
            </div>
            <div>
                <ul>
                    <li>
                        <a href mnav="index.html"><b>HOME</b></a>
                    </li>
                    <li>
                        <a href mnav="consulta.html"><b>CONSULTA</b></a>
                    </li>
                    <li>
                        <a href mnav="mapa.html"><b>MAPA</b></a>
                    </li>
                </ul>
            </div>
        </nav>
    </header>
    <section id="teste">
        <!-- <div class ="white-box">   -->
    </section>

    </div>
    <script>
        document.querySelectorAll( '[mnav]' ).forEach( link => {
            const conteudo = document.getElementById( 'teste' )

            link.onclick = function ( e ) {
                e.preventDefault()
                fetch( link.getAttribute( 'mnav' ) )
                    .then( resp => resp.text() )
                    .then( html => conteudo.innerHTML = html )
            }
        } )


        //HERE I WANT TO MANIPULATE THE SCRIPT THAT IS INSERTED (A FORM)

        const submit = document.querySelector( '[mSubmit' )
        submit.onclick = function ( e ) {
            e.preventDefault()
            const form = e.target.parentNode
            const formData = new FormData( form )
            const hora = formData.get( 'horas' )
            const minuto = formData.get( 'minutos' )
            console.log( hora )
            console.log( minuto )
        }

    </script>
</body>

</html>

解决方法

方法1:使用事件委托(推荐)

利用事件冒泡机制,将事件绑定到已存在的父元素上(比如#teste),无论子元素是初始加载还是动态插入,都能触发事件。同时修正你原代码中选择器的语法错误([mSubmit缺少闭合方括号):

document.querySelectorAll('[mnav]').forEach(link => {
    const conteudo = document.getElementById('teste')

    link.onclick = function (e) {
        e.preventDefault()
        fetch(link.getAttribute('mnav'))
            .then(resp => resp.text())
            .then(html => conteudo.innerHTML = html)
    }
})

// 绑定事件到父元素#teste
document.getElementById('teste').addEventListener('click', function(e) {
    // 验证点击的元素是目标按钮
    if (e.target.hasAttribute('mSubmit')) {
        e.preventDefault()
        const form = e.target.parentNode
        const formData = new FormData(form)
        const hora = formData.get('horas')
        const minuto = formData.get('minutos')
        console.log(hora)
        console.log(minuto)
    }
})

方法2:在HTML插入完成后绑定事件

在Fetch的回调函数中,等HTML插入到#teste后,再获取动态元素并绑定事件:

document.querySelectorAll('[mnav]').forEach(link => {
    const conteudo = document.getElementById('teste')

    link.onclick = function (e) {
        e.preventDefault()
        fetch(link.getAttribute('mnav'))
            .then(resp => resp.text())
            .then(html => {
                conteudo.innerHTML = html
                // 插入完成后获取目标元素并绑定事件
                const submit = conteudo.querySelector('[mSubmit]')
                if (submit) {
                    submit.onclick = function(e) {
                        e.preventDefault()
                        const form = e.target.parentNode
                        const formData = new FormData(form)
                        const hora = formData.get('horas')
                        const minuto = formData.get('minutos')
                        console.log(hora)
                        console.log(minuto)
                    }
                }
            })
    }
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:14:37