Chrome/Firefox支持link.onload/onerror,Safari仅支持onerror;可靠方案是结合事件监听与getComputedStyle轮询检测样式是否生效,并设5秒超时。

link标签的onload和onerror在Chrome/Firefox中确实可用,但Safari不支持onload
现代浏览器中, 元素的 onload 和 onerror 事件在 Chrome、Firefox、Edge(Chromium)中能可靠触发,但 Safari(截至 Safari 17.6)**完全不触发 onload**,仅支持 onerror。这意味着仅靠 onload 判断“加载成功”在 Safari 下会永远挂起。
根本原因:Safari 将 CSS 加载视为异步但不可观测过程,不派发 load 事件——这不是 bug,而是规范未强制要求,而 Safari 选择不实现。
判断CSS是否真正生效,得看样式是否被应用到DOM上
比监听事件更可靠的方案,是检测目标样式是否实际影响了某个元素的计算样式。例如,你动态插入一个带 单一机制都不保险,生产环境应分层判断: 示例关键逻辑: 这个方案只适用于 如果你控制不了 link 标签插入时机(比如由第三方 SDK 注入),或 CSS 是通过构建工具内联的,那“监听是否引入成功”本身就不成立——它压根没走网络加载流程。test-class 的 .test-class { opacity: 0.001; },然后轮询 getComputedStyle(el).opacity 是否变为 "0.001"。
document.body.appendChild(testEl))color),优先选低干扰、高唯一性的声明,比如 font-family: "css-loaded-123"; 或 margin-top: 9999px;
requestAnimationFrame 比 setTimeout 更稳妥兼容性兜底:onerror + onload + 计算样式检测三者组合
link.onerror:只要触发,说明加载失败(404、CORS、解析错误等)link.onload 并 resolve Promiselink 插入后启动样式检测逻辑(带超时)const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = '/path/to/style.css';
const timeoutId = setTimeout(() => reject(new Error('CSS load timeout')), 5000);
link.onload = () => { clearTimeout(timeoutId); resolve(); };
link.onerror = () => { clearTimeout(timeoutId); reject(new Error('CSS load failed')); };
document.head.appendChild(link);
// 同时启动样式检测(略去具体轮询实现)
注意:@import、CSSOM注入、preload link不适用此监听方式
标签动态插入场景。以下情况不适用:
@import 在 CSS 文件内部 —— 完全无事件可监听,也无法提前感知document.styleSheets[...].insertRule() 注入规则 —— 属于运行时操作,不涉及网络加载 —— preload 只预取,不自动应用,且无 onload 事件
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











