唯一可靠方式是动态创建并插入标签到中;因$.get()或$.ajax()仅返回css文本字符串,无法触发浏览器原生样式解析机制,导致丢失缓存、@import、媒体查询等关键能力。

直接用 $("<link>") 创建并插入 head 是唯一可靠方式;$.get() 或 $.ajax() 加载 CSS 文本再塞进 <style></style> 会丢掉缓存、@import、媒体查询等原生能力,不推荐。
为什么不能用 $.get() 加载 CSS 字符串
浏览器不会解析字符串为样式规则——你拿到的是纯文本,.html(data) 或 $("<style>").text(data).appendTo("head")</style> 都绕过了原生 CSS 加载机制。结果是:@media 不生效、@font-face 可能失败、HTTP 缓存失效、@import 被忽略,且无法被 DevTools 的 Styles 面板完整追踪。
动态创建 <link> 标签的正确写法
这是最接近手动写 <link rel="stylesheet"> 的做法,兼容 IE9+,支持缓存、CORS、preload 等标准行为。
- 必须用
rel: "stylesheet"、type: "text/css"、href: "xxx.css"三者齐全 - 必须插入到
head,插到body或任意 div 里无效 - 加
id属性(如id: "theme-css")便于后续查重和替换 - 示例:
$("<link>", { rel: "stylesheet", type: "text/css", href: "/css/dark.css", id: "dark-theme-css" }).appendTo("head");
切换皮肤时改 href 还是删了重插
直接改已有 link 的 href 属性理论上可行,但老项目中容易出问题:IE 对 reload 行为不一致、CDN 缓存未更新、CSP 拦截(若漏掉 integrity 或 crossorigin)、404 静默失败。
- 更稳妥的做法是先
.remove()原link,再新建一个插入 - 务必加时间戳防缓存:
href: "skins/light.css?v=" + Date.now() - 若原
link含integrity或crossorigin,新link必须一并设置,否则可能被拦截 - 避免用
.prop("href", ...)—— 它设的是解析后的绝对 URL,不触发重载
加载完成怎么判断
老版 jQuery(如 1.12 / 2.1)不提供统一的加载回调,link.onload 在 IE9+ 才可靠;IE9 只能靠 onreadystatechange,状态为 "loaded" 或 "complete" 才算完。
- 最通用的降级方案:轮询
document.styleSheets,检查目标href是否已存在 - 移动端 Safari 有时延迟生效,可加
setTimeout(() => { /* 强制 layout */ }, 16) - 跨域 CSS 在 IE 中静默失败,无错误提示,务必确保同源或服务端配好
Access-Control-Allow-Origin
真正麻烦的不是插入,而是查重、缓存控制、跨域、IE 兼容性这四点——漏掉任一个,都可能让样式在某台机器上完全不生效,且难以复现。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











