dom节点原生的append、appendChild方法

博客详细记录了在企业微信环境中,解决页面表单元素失灵问题的过程。通过逐步排查,发现并修复了使用ParentNode.append方法导致的兼容性问题。

小剧情

lily给我消息了,让我过去,准没好事,崛地而起冲过去。项目某个页面在企业微信中打开,页面表单元素失灵了。一个巴掌是拍不响的,种种小情节导致躁脾气蠢蠢欲动,人有时脾气是要撒出去的,不然影响健康。

怼了个开场白,避免干仗,转头去趟CC(WC昵称),回到案发现场,儒雅的那个我又回来了,看着Lily也可爱多了。携带诚意表达自己的态度,我回去仔细排查,出结果告诉她,lily也热心给提供线索。

问题面前更需要平常心,bug的出现,必定是没有按照相关语言的套路出牌。

企业微信没有调试工具,在正常浏览器里又是正常的,这个时候杀手锏是必要的,逐块、关键行添加alert,一定会找到想要的答案。

调试到第四次,找到了关键模块,进到模块中,逐行排查,范围缩小到四行代码。盯着代码,append、appendChild,这是个老项目用的jquery,这个地方我是在dom节点上使用的原生的append,一贯用的appendChild,就是这里了,改成appendChild果然正常运作。

先部署生产环境,不耽误lily进度。

然后有了下边的内容。

ParentNode.append 方法

ParentNode.append 方法在 ParentNode的最后一个子节点之后插入一组 Node 对象或 DOMString 对象。
被插入的 DOMString 对象等价为 Text 节点。

与 Node.appendChild() 的差异:

(1)ParentNode.append()允许追加 DOMString 对象,而 Node.appendChild() 只接受 Node 对象。

(2)ParentNode.append() 没有返回值,而 Node.appendChild() 返回追加的 Node 对象。

(3)ParentNode.append() 可以追加多个节点和字符串,而 Node.appendChild() 只能追加一个节点。

在这里插入图片描述

以上来自MDN

剧情分析

调试一下,查看企业微信中内嵌浏览器版本如下:
在这里插入图片描述
我机器上的chrome版本如下:

在这里插入图片描述
53—>84之间差了有几个世纪了,这也就解释了为什么机器上的chrome没有问题,企业微信里就不行。

💪 不懂就要挖,狠狠挖,挖到底就明白啦!

一起挖起来!!!!

<think>好的,用户的问题是如何将HTML标签字符串转换为DOM节点。我需要结合之前提供的引用信息来解答这个问题。首先,用户提到的引用[2]详细介绍了四种方法:innerHTML、insertAdjacentHTML、DOMParser和createContextualFragment。这些方法各有优缺点,需要逐一分析。 接下来,我需要考虑用户可能的实际应用场景。比如,他们可能在处理动态内容加载,或者从服务器获取HTML字符串后需要渲染到页面上。同时,用户可能关心安全性问题,比如XSS攻击,这在引用[2]中也有提到,所以需要在回答中强调这一点。然后,我需要确保回答的结构清晰,按照用户的要求分步骤说明。每种方法需要给出代码示例,并指出兼容性和安全性。例如,innerHTML是最常用的方法,但存在XSS风险,而DOMParser可能在某些旧浏览器中不支持。另外,用户可能对性能有要求,比如使用DocumentFragment来减少重排,这在引用[4]中提到,所以可以作为一个优化点加入回答中。同时,引用[3]提到的jQuery方法,如果用户使用jQuery,也可以简要提及,但主要应集中在原生JavaScript的实现上。最后,生成的相关问题需要围绕用户可能进一步的需求,比如安全处理、动态添加后的操作、性能优化等。确保问题覆盖用户可能感兴趣的扩展话题。</think>### HTML字符串转DOM节点方法详解 将HTML字符串转换为DOM节点是前端开发中常见的操作,以下是五种常用方法及其实现细节: #### 一、innerHTML方法(最常用) ```javascript // 创建容器元素 let tempDiv = document.createElement('div'); // 注入HTML字符串 tempDiv.innerHTML = '<span class="highlight">文本内容</span>'; // 提取DOM节点 let newNode = tempDiv.firstChild; ``` **特点**: - 兼容所有浏览器(IE5.5+) - 自动闭合不完整标签(如`<p>`自动补`</p>`) - **存在XSS风险**:会执行`<script>`标签内容[^2] #### 二、insertAdjacentHTML方法 ```javascript let container = document.createElement('div'); container.insertAdjacentHTML('afterbegin', '<ul><li>列表项</li></ul>'); let newList = container.firstElementChild; ``` **优势**: - 支持插入位置选择(beforebegin/afterbegin/beforeend/afterend) - 处理表格元素时更规范(适用于`<tr>`,`<td>`等)[^2] #### 三、DOMParser对象(现代浏览器推荐) ```javascript const parser = new DOMParser(); const doc = parser.parseFromString('<div><p>安全解析</p></div>', 'text/html'); const parsedNodes = doc.body.childNodes; ``` **安全特性**: - 自动过滤危险脚本(`<script>`不会执行) - 严格遵循HTML规范解析(自动修正错误标签)[^2] #### 四、Range.createContextualFragment ```javascript const range = document.createRange(); const fragment = range.createContextualFragment('<b>动态内容</b><script>alert(1)</script>'); document.body.append(fragment); // 脚本会立即执行 ``` **注意事项**: - 需要已有文档上下文 - 会执行包含的脚本代码 - 适合动态模板注入场景[^2] #### 五、DocumentFragment优化方案 ```javascript const fragment = document.createDocumentFragment(); const tempDiv = document.createElement('div'); tempDiv.innerHTML = '<div>临时内容</div>'; while(tempDiv.firstChild) { fragment.appendChild(tempDiv.firstChild); } document.getElementById('target').appendChild(fragment); ``` **性能优势**: - 批量操作减少页面重绘次数 - 内存占用更低 - 特别适合批量插入节点[^4] #### 安全建议: 1. 始终使用`textContent`替代`innerHTML`处理纯文本 2. 对用户输入内容使用DOMPurify等库过滤: ```javascript import DOMPurify from 'dompurify'; const safeHTML = DOMPurify.sanitize(untrustedHTML); ``` #### 相关扩展问题 1. 如何防止HTML字符串转换时的XSS攻击? 2. DocumentFragment与普通DOM操作有何性能差异? 3. 转换后的DOM节点如何高效插入文档? 4. 如何处理SVG等特殊标签的转换? 5. 不同解析方法对DOCTYPE声明的影响? [^1]: 基础DOM操作方法示例 [^2]: HTML转DOM方法安全对比 [^4]: DocumentFragment性能优化原理
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值