要判斷這個 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.companysz.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
主站蜘蛛池模板:
91精品国产91久久久久久蜜臀
|
澳门一级淫片免费视频
|
亚洲福利在线视频
|
91av在线免费观看
|
九九热九九热
|
日韩视频―中文字幕
|
免费看成年人视频在线
|
亚洲国产精品高潮呻吟久久
|
午夜影视一区二区
|
中国成人在线视频
|
一级做受毛片免费大片
|
羞羞的视频在线观看
|
国产在线a|
91成人亚洲|
一级网站片
|
亚洲综合精品
|
欧美在线观看视频网站
|
成人毛片免费
|
黄色av一区二区三区
|
美国一级黄色毛片
|
蜜桃网在线
|
亚洲视频观看
|
国产精品99久久久久久久女警
|
免费看黄色一级大片
|
在线天堂中文在线资源网
|
日韩毛片免费观看
|
gogo全球大胆高清人露出91
|
国产超碰人人做人人爱
|
27xxoo无遮挡动态视频
|
午夜视频成人
|
国产亚洲精品久久久久婷婷瑜伽
|
亚洲免费永久
|
国产精品v片在线观看不卡
成人一区二区三区在线
|
一级色毛片
|
操操日日
|
国产合集91合集久久日
|
久久成人综合视频
|
国产精品一区视频
|
性欧美性欧美
|
成人性视频欧美一区二区三区
|
综合网天天色
|