从Template导入节点时设置ID无效问题求助
问题原因分析
你遇到的问题核心在于**document.importNode返回的是DocumentFragment(文档片段)对象**,而非你预期的DOM元素。
当你给这个片段设置id="mouhaha"时,控制台能输出该id是因为属性确实被挂载到了片段上,但片段本身并不会被插入到DOM树中——执行appendChild(node)时,只有片段里的子元素(也就是模板内的<div class="article-wide-image">)会被转移到#article节点下,片段本身会被直接丢弃,所以你设置的id根本没进入实际的DOM结构,自然用getElementById找不到它。
解决方案
你需要给片段里的实际DOM元素设置id,而非给片段本身设置。修改后的代码如下:
let template = document.getElementById("template-wide-image"); let node = document.importNode(template.content, true); // 定位到片段内的目标div,给它设置id const targetDiv = node.querySelector(".article-wide-image"); targetDiv.id = "mouhaha"; console.log(targetDiv.id); // mouhaha document.getElementById("article").appendChild(node); console.log(document.getElementById("mouhaha")); // 现在能正常获取到元素了
补充说明
DocumentFragment的作用是作为节点的临时容器,它可以高效地批量操作DOM而不会触发多次页面重排。但它本身不属于DOM树的一部分,所以给它设置的属性(包括id)都不会在最终的页面DOM中生效,你需要操作它内部的子元素来实现预期效果。
内容的提问来源于stack exchange,提问作者Nicolas Manzini
相关产品推荐
相关产品推荐

