IE8及以下不支持HTML5语义标签,需用document.createElement注册并设display:block;IE6–7中innerHTML解析非法嵌套异常,应改用DOM方法创建;IE8不支持getElementsByClassName,需按版本分层降级;条件注释仍是IE9及以下唯一可靠加载方式。

IE8 及以下不支持 HTML5 语义标签怎么办
直接用 <header>、<nav>、<section> 这类标签,在 IE8 及更早版本里不会报错,但浏览器不认识它们,会当成未知内联元素处理——默认不设 display: block,导致样式失效、盒模型错乱、JS 查询不到或返回 null。
最稳妥的解法是用 document.createElement 提前“注册”这些标签,让 IE 知道它们该当块级元素渲染:
if (!document.createElement('header').offsetTop) {
document.createElement('header');
document.createElement('nav');
document.createElement('section');
document.createElement('article');
document.createElement('aside');
document.createElement('footer');
}
这段代码需放在 <head> 中、任何 CSS/JS 引入之前执行。注意:仅声明不够,还得配合 CSS 补上 display: block:
header, nav, section, article, aside, footer {
display: block;
}
IE6–7 中 innerHTML 对嵌套标签解析异常
在 IE6–7 里,对非标准嵌套(比如把 <div> 直接塞进 <p>)调用 innerHTML 赋值后,浏览器会自动“修复”结构,删掉非法子节点或闭合错位标签,结果和预期 DOM 完全不符。
立即学习“前端免费学习笔记(深入)”;
常见触发场景:
-
<p><div>xxx</div></p>→ IE 自动变成<p></p><div>xxx</div> -
<table><div>xxx</div></table>→<div>被丢弃
解决办法只有两个:
- 避免在 IE6–7 环境中用
innerHTML插入含非法嵌套的 HTML 字符串 - 改用 DOM 方法逐层创建:
document.createElement+appendChild,虽然啰嗦但 100% 可控
IE8 不支持 getElementsByClassName 怎么安全降级
旧版 IE 不识别 getElementsByClassName,但很多人误以为 polyfill 加个函数就万事大吉——其实关键点在于:IE8 的 querySelectorAll 虽存在,但对复合选择器(如 .a.b、div[data-id])支持极差,且性能崩坏。
推荐做法是按环境分层处理:
- IE9+:直接用
document.getElementsByClassName - IE8:用
document.querySelectorAll('.my-class')(仅限简单类名,不含空格或伪类) - IE6–7:手写遍历 +
className.split(' ').indexOf(...)判断,或引入轻量库如selectivizr(只补 CSS 选择器)
别用网上那些“一行兼容”方案,比如 document.body.getElementsByTagName('*').filter(...) —— IE6 下根本没有 filter,且全量遍历性能极差。
条件注释已废弃,但仍是 IE 专属加载唯一可靠方式
从 IE10 开始,[if IE] 条件注释彻底失效;但在 IE9 及以下,它仍是唯一能精准隔离 JS/CSS 的机制,比 UA 判断或特性检测都稳。
典型用法:
<!--[if lt IE 9]> <script src="html5shiv.min.js"></script> <link rel="stylesheet" href="ie-fix.css"> <![endif]-->
注意两点:
-
lt IE 9包含 IE6/7/8,gte IE 8表示 IE8+(IE8 支持,IE9+ 不执行) - 不要试图在 IE10+ 中用 JS 模拟条件注释——DOM 解析时早已跳过,无法动态注入
现在看来,条件注释像古董,但只要还有一台 IE8 在跑生产系统,它就不是可选项,而是必选项。其他所有“现代”兼容方案,在真实旧 IE 环境里要么漏判,要么多加载,要么破坏原有结构。


















