123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- /*
- * Require-CSS RequireJS css! loader plugin
- * 0.1.2
- * Guy Bedford 2013
- * MIT
- */
- /*
- *
- * Usage:
- * require(['css!./mycssFile']);
- *
- * Tested and working in (up to latest versions as of March 2013):
- * Android
- * iOS 6
- * IE 6 - 10
- * Chome 3 - 26
- * Firefox 3.5 - 19
- * Opera 10 - 12
- *
- * browserling.com used for virtual testing environment
- *
- * Credit to B Cavalier & J Hann for the IE 6 - 9 method,
- * refined with help from Martin Cermak
- *
- * Sources that helped along the way:
- * - https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent
- * - http://www.phpied.com/when-is-a-stylesheet-really-loaded/
- * - https://github.com/cujojs/curl/blob/master/src/curl/plugin/css.js
- *
- */
- define(function() {
- //>>excludeStart('excludeRequireCss', pragmas.excludeRequireCss)
- if (typeof window == 'undefined')
- return { load: function(n, r, load){ load() } };
- var head = document.getElementsByTagName('head')[0];
- var engine = window.navigator.userAgent.match(/Trident\/([^ ;]*)|AppleWebKit\/([^ ;]*)|Opera\/([^ ;]*)|rv\:([^ ;]*)(.*?)Gecko\/([^ ;]*)|MSIE\s([^ ;]*)|AndroidWebKit\/([^ ;]*)/) || 0;
- // use <style> @import load method (IE < 9, Firefox < 18)
- var useImportLoad = false;
-
- // set to false for explicit <link> load checking when onload doesn't work perfectly (webkit)
- var useOnload = true;
- // trident / msie
- if (engine[1] || engine[7])
- useImportLoad = parseInt(engine[1]) < 6 || parseInt(engine[7]) <= 9;
- // webkit
- else if (engine[2] || engine[8])
- useOnload = false;
- // gecko
- else if (engine[4])
- useImportLoad = parseInt(engine[4]) < 18;
- //>>excludeEnd('excludeRequireCss')
- //main api object
- var cssAPI = {};
- //>>excludeStart('excludeRequireCss', pragmas.excludeRequireCss)
- cssAPI.pluginBuilder = './css-builder';
- // <style> @import load method
- var curStyle, curSheet;
- var createStyle = function () {
- curStyle = document.createElement('style');
- head.appendChild(curStyle);
- curSheet = curStyle.styleSheet || curStyle.sheet;
- }
- var ieCnt = 0;
- var ieLoads = [];
- var ieCurCallback;
-
- var createIeLoad = function(url) {
- ieCnt++;
- if (ieCnt == 32) {
- createStyle();
- ieCnt = 0;
- }
- curSheet.addImport(url);
- curStyle.onload = function(){ processIeLoad() };
- }
- var processIeLoad = function() {
- ieCurCallback();
-
- var nextLoad = ieLoads.shift();
-
- if (!nextLoad) {
- ieCurCallback = null;
- return;
- }
-
- ieCurCallback = nextLoad[1];
- createIeLoad(nextLoad[0]);
- }
- var importLoad = function(url, callback) {
- if (!curSheet || !curSheet.addImport)
- createStyle();
- if (curSheet && curSheet.addImport) {
- // old IE
- if (ieCurCallback) {
- ieLoads.push([url, callback]);
- }
- else {
- createIeLoad(url);
- ieCurCallback = callback;
- }
- }
- else {
- // old Firefox
- curStyle.textContent = '@import "' + url + '";';
- var loadInterval = setInterval(function() {
- try {
- curStyle.sheet.cssRules;
- clearInterval(loadInterval);
- callback();
- } catch(e) {}
- }, 10);
- }
- }
- // <link> load method
- var linkLoad = function(url, callback) {
- var link = document.createElement('link');
- link.type = 'text/css';
- link.rel = 'stylesheet';
- if (useOnload)
- link.onload = function() {
- link.onload = function() {};
- // for style dimensions queries, a short delay can still be necessary
- setTimeout(callback, 7);
- }
- else
- var loadInterval = setInterval(function() {
- for (var i = 0; i < document.styleSheets.length; i++) {
- var sheet = document.styleSheets[i];
- if (sheet.href == link.href) {
- clearInterval(loadInterval);
- return callback();
- }
- }
- }, 10);
- link.href = url;
- head.appendChild(link);
- }
- //>>excludeEnd('excludeRequireCss')
- cssAPI.normalize = function(name, normalize) {
- if (name.substr(name.length - 4, 4) == '.css')
- name = name.substr(0, name.length - 4);
- return normalize(name);
- }
- //>>excludeStart('excludeRequireCss', pragmas.excludeRequireCss)
- cssAPI.load = function(cssId, req, load, config) {
- (useImportLoad ? importLoad : linkLoad)(req.toUrl(cssId + '.css'), load);
- }
- //>>excludeEnd('excludeRequireCss')
- return cssAPI;
- });
|