博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何判断link标签css文件加载完毕
阅读量:3519 次
发布时间:2019-05-20

本文共 1820 字,大约阅读时间需要 6 分钟。

动态加载css都是通过DOM操作新增一个link标签来实现,常见的代码如下:
    
var
 node 
=
 document.createElement(
"
link
"
);
    node.setAttribute(
"
rel
"
,
"
stylesheet
"
);
    node.setAttribute(
"
type
"
,
"
text/css
"
);
    node.setAttribute(
"
href
"
,
"
xx.css
"
);
    document.body.appendChild(node);
但是要判断这个css文件是否加载完毕,各个浏览器的做法差异比较大,今天在读 源代码时想到里面应该能找到我想要的代码,下面是改编自seajs中的源码:
    
<
script 
type
="text/javascript"
>
function
 styleOnload(node, callback) {
    
//
 for IE6-9 and Opera
    
if
 (node.attachEvent) {
      node.attachEvent('onload', callback);
      
//
 NOTICE:
      
//
 1. "onload" will be fired in IE6-9 when the file is 404, but in
      
//
 this situation, Opera does nothing, so fallback to timeout.
      
//
 2. "onerror" doesn't fire in any browsers!
    }
    
//
 polling for Firefox, Chrome, Safari
    
else
 {
      setTimeout(
function
() {
        poll(node, callback);
      }, 
0
); 
//
 for cache
    }
  }
  
function
 poll(node, callback) {
    
if
 (callback.isCalled) {
      
return
;
    }
    
var
 isLoaded 
=
 
false
;
    
if
 (
/
webkit
/
i.test(navigator.userAgent)) {
//
webkit
      
if
 (node['sheet']) {
        isLoaded 
=
 
true
;
      }
    }
    
//
 for Firefox
    
else
 
if
 (node['sheet']) {
      
try
 {
        
if
 (node['sheet'].cssRules) {
          isLoaded 
=
 
true
;
        }
      } 
catch
 (ex) {
        
//
 NS_ERROR_DOM_SECURITY_ERR
        
if
 (ex.code 
===
 
1000
) {
          isLoaded 
=
 
true
;
        }
      }
    }
    
if
 (isLoaded) {
      
//
 give time to render.
      setTimeout(
function
() {
        callback();
      }, 
1
);
    }
    
else
 {
      setTimeout(
function
() {
        poll(node, callback);
      }, 
1
);
    }
  }
  
function
 loadcss(){
    
var
 node 
=
 document.createElement(
"
link
"
);
    node.setAttribute(
"
rel
"
,
"
stylesheet
"
);
    node.setAttribute(
"
type
"
,
"
text/css
"
);
    node.setAttribute(
"
href
"
,
"
xx.css
"
);
    document.body.appendChild(node);
    styleOnload(node,
function
(){
        alert(
"
loaded
"
);
    });
  }
    
</
script
>
单靠onload事件是不解决问题的。FF,webkit可以通过node.sheet.cssRules属性是否存在来判断是否加载完毕,IE6-9以及opera可以利用onload。其他浏览器需要通过定时任务来判断是否加载完毕。
照着这个思路,推荐大家去读读jQuery源码,domready事件的判断,原理也类似,每个浏览器的处理细节不一样。
seajs源码:

转载地址:http://jymqj.baihongyu.com/

你可能感兴趣的文章
Java中时间戳和时间格式的转换
查看>>
Dubbo基础知识整理
查看>>
计算机网络知识整理
查看>>
Java基础知识
查看>>
操作系统知识整理
查看>>
实现自己的权限管理系统(二):环境配置以及遇到的坑
查看>>
实现自己的权限管理系统(四): 异常处理
查看>>
实现自己的权限管理系统(十):角色模块
查看>>
实现自己的权限管理系统(十二):权限操作记录
查看>>
实现自己的权限管理系统(十三):redis做缓存
查看>>
实现自己的权限管理系统(十四):工具类
查看>>
JavaWeb面经(一):2019.9.14
查看>>
JavaWeb面经(二):2019.9.16 Synchronized关键字底层原理及作用
查看>>
JavaWeb面试经:redis
查看>>
牛客的AI模拟面试(1)
查看>>
深入浅出MyBatis:MyBatis解析和运行原理
查看>>
Mybatis与Ibatis
查看>>
字节码文件(Class文件)
查看>>
java中的IO流(一)----概述
查看>>
StringBuilder
查看>>