要判斷這個 CSS 文件是否加載完畢,各個瀏覽器的做法差異比較大,這次要說IE瀏覽器做的不錯,我們可以直接通過onload方法來處理CSS加載完成以后的處理:
// 代碼節選至seajs
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!
}
}
很遺憾,這次在其他的瀏覽器中,想判斷CSS是否加載完成就不是那么方便了,FF,webkit可以通過node.sheet.cssRules屬性是否存在來判斷是否加載完畢。而且需要使用setTimeout間隔事件輪詢:
// 代碼節選至seajs
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);
}
}
setTimeout(function() {
poll(node, callback);
}, 0);
SeaJS給出的完整的處理是這樣的:
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);
}
}
// 我的動態創建LINK函數
function createLink(cssURL,lnkId,charset,media){
var head = document.getElementsByTagName('head')[0],
linkTag = null;
if(!cssURL){
return false;
}
linkTag = document.createElement('link');
linkTag.setAttribute('id',(lnkId || 'dynamic-style'));
linkTag.setAttribute('rel','stylesheet');
linkTag.setAttribute('charset',(charset || 'utf-8'));
linkTag.setAttribute('media',(media||'all'));
linkTag.setAttribute('type','text/css');
linkTag.href = cssURL;
head.appendChild(linkTag);
}
function loadcss(){
var styleNode = createLink('/wp-content/themes/BlueNight/style.css');
styleOnload(styleNode,function(){
alert("loaded");
});
}
在看到seajs的代碼的時候,我立刻想起了我看到Diego Perini的另一個解決方案:
/*
* Copyright (C) 2010 Diego Perini
* All rights reserved.
*
* cssready.js - CSS loaded/ready state notification
*
* Author: Diego Perini <diego.perini at gmail com>
* Version: 0.1
* Created: 20100616
* Release: 20101104
*
* License:
* //www.49028c.com * Download:
* http://javascript.nwbox.com/cssready/cssready.js
*/
function cssReady(fn, link) {
var d = document,
t = d.createStyleSheet,
r = t ? 'rules' : 'cssRules',
s = t ? 'styleSheet' : 'sheet',
l = d.getElementsByTagName('link');
// passed link or last link node
link || (link = l[l.length - 1]);
function check() {
try {
return link && link[s] && link[s][r] && link[s][r][0];
} catch(e) {
return false;
}
}
(function poll() {
check() && setTimeout(fn, 0) || setTimeout(poll, 100);
})();
}
其實,如果你讀過jQuery的domready事件的判斷的代碼,原理也類似。也是通過setTimeout輪詢的方式來判斷DOM節點是否加載完畢。
還有,Fackbook則是通過在動態創建的CSS樣式中包含一個固定的樣式,例如#loadcssdom,loadcssdom就是一個高度為1px樣式。然后動態創建一個DOM對象,添加這個loadcssdom樣式。然后也是setTimeout輪詢loadcssdo是否已經有1px的高度了。這個處理方式的解決方案,大家可以下《CSSP: Loading CSS with Javascript 亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩精品电影|
欧美丝袜美女中出在线|
欧美午夜精品久久久久久人妖|
亚洲成人黄色网|
www.美女亚洲精品|
欧美贵妇videos办公室|
欧美成人中文字幕在线|
亚洲国产精品电影|
久久精品国产亚洲|
国产精品视频yy9099|
国精产品一区一区三区有限在线|
成人a在线观看|
亚洲自拍偷拍在线|
欧美日韩国产一区二区三区|
欧美亚洲另类激情另类|
一区二区欧美亚洲|
精品无人区太爽高潮在线播放|
欧美色另类天堂2015|
日韩暖暖在线视频|
日韩精品免费一线在线观看|
538国产精品一区二区免费视频|
国产精品成人播放|
国内精品模特av私拍在线观看|
欧美高清理论片|
亚洲高清色综合|
欧美日韩亚洲视频|
亚洲已满18点击进入在线看片|
日韩中文字幕网址|
久久久亚洲国产天美传媒修理工|
久久香蕉国产线看观看网|
欧美洲成人男女午夜视频|
97热精品视频官网|
欧美性xxxx18|
日韩电视剧免费观看网站|
久久久久亚洲精品成人网小说|
亚洲天堂网站在线观看视频|
久久久中文字幕|
亚洲美女av网站|
亚洲色图15p|
久久久久成人网|
国产精品毛片a∨一区二区三区|国|
日韩电影视频免费|
日韩在线精品一区|
国产精品中文字幕久久久|
国产精品第1页|
欧美极品少妇xxxxⅹ免费视频|
91中文精品字幕在线视频|
中文字幕日韩欧美在线视频|
欧洲一区二区视频|
日韩有码在线播放|
色一情一乱一区二区|
亚洲成av人乱码色午夜|
成人黄色在线观看|
久久影院资源站|
国产成人综合亚洲|
91po在线观看91精品国产性色|
亚洲精品一区中文字幕乱码|
国产精品久久久一区|
精品偷拍各种wc美女嘘嘘|
国产成人精品在线视频|
亚洲国产高清高潮精品美女|
国产自产女人91一区在线观看|
国产人妖伪娘一区91|
福利精品视频在线|
久久影视电视剧免费网站|
欧美在线视频导航|
精品在线观看国产|
久久精品国产一区二区电影|
久久久久久久91|
91美女片黄在线观看游戏|
97国产suv精品一区二区62|
国产精选久久久久久|
97精品在线视频|
久久91亚洲人成电影网站|
欧美日韩另类在线|
欧美国产日韩一区二区三区|
日韩有码在线观看|
日韩精品视频在线观看网址|
亚洲人成网站999久久久综合|
国产激情久久久久|
亚洲精品黄网在线观看|
亚洲影院色无极综合|
国产精品嫩草影院一区二区|
国产男人精品视频|
97视频在线观看免费|
久久免费精品视频|
一本色道久久88综合日韩精品|
国产精品久久av|
成人女保姆的销魂服务|
欧美电影免费观看|
亚洲国产欧美自拍|
中文字幕在线观看亚洲|
久国内精品在线|
亚洲成人黄色网|
久久精品最新地址|
国产性色av一区二区|
精品国产91乱高清在线观看|
综合激情国产一区|
亚洲欧美日韩一区二区在线|
国产精品老女人视频|
国产精品久久久久国产a级|
81精品国产乱码久久久久久|
日本精品性网站在线观看|
亚洲人免费视频|
视频在线一区二区|
日韩欧美a级成人黄色|
亚洲www永久成人夜色|
97香蕉久久超级碰碰高清版|
国产精品丝袜高跟|
日韩美女免费线视频|
成人免费xxxxx在线观看|
国产欧美日韩中文字幕在线|
一区二区三区四区视频|
国产99视频在线观看|
国产精品久久久久久久久免费|
91精品久久久久久久久久另类|
精品少妇v888av|
成人黄色大片在线免费观看|
久久久日本电影|
中文字幕欧美视频在线|
57pao国产成人免费|
国产成人精品在线观看|
97视频在线观看网址|
91丨九色丨国产在线|
欧美性猛交xxxx偷拍洗澡|
亚洲一区999|
国产欧美一区二区三区在线|
国内精品视频在线|
国内精品久久久久久久|
成人精品一区二区三区电影黑人|
亚洲美女在线观看|
精品中文视频在线|
色妞久久福利网|
日本一本a高清免费不卡|
亚洲欧美国产高清va在线播|
欧美日韩在线免费|
成人欧美一区二区三区在线|
欧美亚洲免费电影|
中文字幕日韩精品有码视频|
一本色道久久88综合亚洲精品ⅰ|
日本在线观看天堂男亚洲|
精品无人区太爽高潮在线播放|
欧美性猛交xxxx乱大交极品|
欧美电影免费在线观看|
欧美日韩性生活视频|
国产精品露脸av在线|
日韩在线观看高清|
成人福利网站在线观看11|
日韩电影第一页|
国产91ⅴ在线精品免费观看|
97超级碰碰碰久久久|
中国china体内裑精亚洲片|
美女av一区二区三区|
91超碰中文字幕久久精品|
亚洲精品福利在线|
亚洲男人天堂网|
成年无码av片在线|
久久久国产精品x99av|
精品中文字幕在线2019|
日韩av综合网站|
欧美日韩一区二区精品|
亚洲人成网站777色婷婷|
国产在线观看一区二区三区|
日韩av最新在线|