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

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










