innerHTML在Firefox中的解析陷阱:tr节点td标签丢失问题

作者:异步漫步

时间:2026-10-24

浏览:543

本文探讨innerHTML在Firefox浏览器中的特殊行为。当HTML字符串直接赋值给tr节点的innerHTML时,Firefox会错误地移除td标签并仅保留文本内容。通过调整DOM树构建顺序,先创建并追加tr到table,再设置innerHTML,可避免此解析错误。

文章目录

innerHTML在Firefox中的解析陷阱

回顾过往,IE浏览器对innerHTML的处理存在诸多已知特性:它会丢弃标签前的空白字符,将所有内部标签强制转换为大写,展示动态添加的属性,且在部分元素中该属性为只读。这一由IE引入的特性,最终暴露出如此多的缺陷,确实令人遗憾。然而,innerHTML在标准遵循度极高的Firefox浏览器中同样存在一个隐蔽的陷阱,具体表现如下文代码所示:


代码如下:

 
var newTable = document.createElement('table');
document.body.appendChild(newTable);
var newTr = document.createElement('tr');
var rowContent = '<td>司徒正美 </td><td><em>RestlessDream</em></td>';
newTr.innerHTML = rowContent;
newTable.appendChild(newTr);
alert(newTable.innerHTML)
if (rowContent.toLowerCase() == newTr.innerHTML.toLowerCase()) {
alert("一定如我所愿!");
}else {
alert("你踩雷了!");
} 

 <!doctype html> <html dir="ltr" lang="zh-CN"> <head> <meta charset="utf-8"/> <meta http-equiv="X-UA-Compatible" content="IE=8" /> <title>强制在IE8模式下运行 by 司徒正美</title>  </head> <body > </body> </html> 

[[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]]


当我们尝试将innerHTML赋值给tr节点时,Firefox的解析机制会将其处理为:


代码如下:

司徒正美 <em>RestlessDream</em>

而预期的原始结构:


代码如下:

<td>司徒正美 </td><td><em>RestlessDream</em></td>

调整DOM顺序的解决方案

可以看到,td标签被意外去除了!起初怀疑这可能与元素加入DOM树的顺序有关,因此调整了代码执行顺序:


代码如下:

 
var newTable = document.createElement('table');
document.body.appendChild(newTable);
var newTr = document.createElement('tr');
newTable.appendChild(newTr);
var rowContent = '<td>司徒正美 </td><td><em>RestlessDream</em></td>';
newTr.innerHTML = rowContent;

 <!doctype html> <html dir="ltr" lang="zh-CN"> <head> <meta charset="utf-8"/> <meta http-equiv="X-UA-Compatible" content="IE=8" /> <title>强制在IE8模式下运行 by 司徒正美</title>  </head> <body > </body> </html> 

[[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]]


通过上述顺序调整,成功解决了Firefox环境下的该问题!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章