# css 加载器
# 动态添加 css 样式表
// 在网页加载完成后引入新的css样式表
function addCssFile(cssUrl) {
var htmlHead = document.getElementsByTagName('head')[0]
var link = document.createElement('link')
link.type = 'text/css'
link.href = cssUrl
htmlHead.appendChild(link)
}
# 动态移除 css 样式表
找到对应的 css link 标签, 将其 dom 直接移除即可达到卸载 css 样式表的目的
// 这里通过 css 文件名为标示来移除指定的css外部样式表, 你也可以使用其他的标志
function removeCssFile(cssFileName) {
var cssList = document.getElementsByTagName('link')
for (var i = 0; i < cssList.length; i++) {
let target = cssList[i]
let targetHref = target.getAttribute('href')
if (targetHref && targetHref.indexOf(cssFileName) > -1) {
target.parentNode.removeChild(target)
}
}
}
# css 样式表的加载器
通过以上的方法,我们可以只做一个 css 外部样式表的加载起,可以在网页加载完成之后根据需求,选择性的加载 css 样式表
var CssLoader = function(href) {
this._href = href
this._id = Math.random()
.toString(32)
.slice(2, 9)
}
var fn = CssLoader.prototype
// 加载到网页
fn.import = function() {
var href = this._href
var id = this._id
var htmlHead = document.getElementsByTagName('head')[0]
var link = document.createElement('link')
link.type = 'text/css'
link.href = href
link.setAttribute('css_id', id)
htmlHead.appendChild(link)
return true
}
// 移除 css
fn.remove = function() {
var id = this._id
var href = this._href
var cssList = document.getElementsByTagName('link')
for (var i = 0; i < cssList.length; i++) {
let target = cssList[i]
let targetHref = target.getAttribute('href')
let targetId = target.getAttribute('css_id')
if (targetId === id && targetHref === href) {
target.parentNode.removeChild(target)
return true
}
}
}
var cssLoaderHandle = new CssLoader(
'https://static.hai-fe.com/yaksa/085dcb13dfd27857b4cd.css'
)
// 载入到网页中
cssLoaderHandle.import()
setTimeout(function() {
// 从网页中移除
cssLoaderHandle.remove()
}, 5 * 1000)
TIP
使用场景: 如 SPA 在代码拆包的场景下使用,避免首屏加载所有的 css 样式表,按需加载页面或者组件时可使用该方法按需加载 css 样式,并可在必要的时候(页面切换,组件切换)移除 css 样式,避免页面样式被污染的情况