/**
* @ignore
* script/css load across browser
* @author yiminghe@gmail.com
*/
(function (S) {
var CSS_POLL_INTERVAL = 30,
UA = S.UA,
logger = S.getLogger('s/loader/getScript'),
Utils = S.Loader.Utils,
// central poll for link node
timer = 0,
monitors = {
// node.id:{callback:callback,node:node}
};
function startCssTimer() {
if (!timer) {
logger.debug('start css poll timer');
cssPoll();
}
}
function isCssLoaded(node, url) {
var loaded = 0;
if (UA.webkit) {
// http://www.w3.org/TR/Dom-Level-2-Style/stylesheets.html
if (node['sheet']) {
logger.debug('webkit css poll loaded: ' + url);
loaded = 1;
}
} else if (node['sheet']) {
try {
var cssRules = node['sheet'].cssRules;
if (cssRules) {
logger.debug('same domain css poll loaded: ' + url);
loaded = 1;
}
} catch (ex) {
var exName = ex.name;
logger.debug('css poll exception: ' + exName + ' ' + ex.code + ' ' + url);
// http://www.w3.org/TR/dom/#dom-domexception-code
if (// exName == 'SecurityError' ||
// for old firefox
exName == 'NS_ERROR_DOM_SECURITY_ERR') {
logger.debug('css poll exception: ' + exName + 'loaded : ' + url);
loaded = 1;
}
}
}
return loaded;
}
// single thread is ok
function cssPoll() {
for (var url in monitors) {
var callbackObj = monitors[url],
node = callbackObj.node;
if (isCssLoaded(node, url)) {
if (callbackObj.callback) {
callbackObj.callback.call(node);
}
delete monitors[url];
}
}
if (S.isEmptyObject(monitors)) {
logger.debug('clear css poll timer');
timer = 0;
} else {
timer = setTimeout(cssPoll, CSS_POLL_INTERVAL);
}
}
// refer : http://lifesinger.org/lab/2011/load-js-css/css-preload.html
// 暂时不考虑如何判断失败,如 404 等
Utils.pollCss = function (node, callback) {
var href = node.href,
arr;
arr = monitors[href] = {};
arr.node = node;
arr.callback = callback;
startCssTimer();
};
Utils.isCssLoaded = isCssLoaded;
})(KISSY);
/*
References:
- http://unixpapa.com/js/dyna.html
- http://www.blaze.io/technical/ies-premature-execution-problem/
`onload` event is supported in WebKit since 535.23
- https://bugs.webkit.org/show_activity.cgi?id=38995
`onload/onerror` event is supported since Firefox 9.0
- https://bugzilla.mozilla.org/show_bug.cgi?id=185236
- https://developer.mozilla.org/en/HTML/Element/link#Stylesheet_load_events
monitor css onload across browsers.issue about 404 failure.
- firefox not ok(4 is wrong):
- http://yearofmoo.com/2011/03/cross-browser-stylesheet-preloading/
- all is ok
- http://lifesinger.org/lab/2011/load-js-css/css-preload.html
- others
- http://www.zachleat.com/web/load-css-dynamically/
*/