XHTML 是用 XML 规则约束 HTML 的变体,非升级版;要求标签小写、属性值加引号、空元素自闭合、且必须声明 application/xhtml+xml MIME 类型,否则解析失败或退化为 HTML。
XHTML 并不是 HTML 的升级版本,而是依照 XML 规则重新约束 HTML 的变体。除非项目需要连接特定旧系统或采用严格 XML 流程,现代开发几乎无需主动选用 XHTML。
<img> 不会报错,XHTML 验证器却会拒绝 <img src="a.jpg">
XHTML 要求所有元素必须显式闭合,空元素(如 <img>、<br>、<hr>)也得写成自闭合形式。HTML5 中 <img src="a.jpg"> 合法,但 XHTML 必须写成 <img src="a.jpg" />(注意斜杠前的空格可选,但 /> 不可省略)。漏掉 / 会导致解析失败,浏览器可能直接停止渲染或显示 XML 解析错误。
/
<input type="text"> 同样必须写为 <input type="text" />
class="nav" 为何 HTML 中可以省略引号,XHTML 中却必须写出 class="nav"
XHTML 继承 XML 规则,所有属性值必须用双引号(")或单引号(')包裹,不能裸写。HTML5 允许 class=nav 或 class='nav',但 XHTML 中只有 class="nav" 或 class='nav' 有效。不加引号会被解析为 malformed markup,XML 解析器直接报错。
'<div class='+cls+'>' 这种写法到了 XHTML 中必然失败id、src、href 等全部属性,同样必须遵循此约束<SCRIPT> 修改为 <script> 后依然遭到 XHTML 拒绝XHTML 会区分大小写,标签名与属性名一律必须小写。即使仅有一个位置使用大写(例如 <DIV>、<Img>、<ONCLICK>),文档整体也不再属于 well-formed XML。HTML 完全不区分大小写,<SCRIPT> 与 <script> 在其中等价;但在 XHTML 中,前者属于非法标签名,解析器会把它当成未知元素,甚至停止 DOM 构建。
立即学习“前端免费学习笔记(深入)”;
onClick 必须改写成 onclick
data-MyAttr)也必须全部小写:data-myattr
application/xhtml+xml 设置MIME类型后页面直接白屏这是最隐蔽的坑:XHTML 文档必须通过 HTTP 响应头声明 Content-Type: application/xhtml+xml,仅靠 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ...> 不够。如果服务器返回的是 text/html(绝大多数默认配置),浏览器就当普通 HTML 解析,前述所有 XHTML 语法规则都会被忽略——等于白写了。而一旦真设成 application/xhtml+xml,任何语法错误(哪怕多一个空格、少一个引号)都会让浏览器直接报 XML 解析错误,页面空白。
application/xhtml+xml
<!DOCTYPE html>,再结合 ESLint / HTMLHint 等工具检查语法,比强行采用 XHTML 更容易控制实际必须使用 XHTML 的情况非常少。多数所谓“标准要求”,通过 HTML5 语义化和严格校验即可满足;强套 XHTML 只会在大小写、闭合、引号、MIME 类型四处反复出错,收益却很低。