/* loadCSS: load a CSS file asynchronously. [c]2015 @scottjehl, Filament Group, Inc. Licensed MIT */ (function(w){
"use strict"; /* exported loadCSS */ w.loadCSS = function( href, before, media ){ // Arguments explained: // `href` [REQUIRED] is the URL for your CSS file. // `before` [OPTIONAL] is the element the script should use as a reference for injecting our stylesheet <link> before // By default, loadCSS attempts to inject the link after the last stylesheet or script in the DOM. However, you might desire a more specific location in your document. // `media` [OPTIONAL] is the media type or query of the stylesheet. By default it will be 'all' var ss = w.document.createElement( "link" ); var ref; if( before ){ ref = before; } else if( w.document.querySelectorAll ){ var refs = w.document.querySelectorAll( "style,link[rel=stylesheet],script" ); // No need to check length. This script has a parent element, at least ref = refs[ refs.length - 1]; } else { ref = w.document.getElementsByTagName( "script" )[ 0 ]; } var sheets = w.document.styleSheets; ss.rel = "stylesheet"; ss.href = href; // temporarily set media to something inapplicable to ensure it'll fetch without blocking render ss.media = "only x"; // Inject link // Note: the ternary preserves the existing behavior of "before" argument, but we could choose to change the argument to "after" in a later release and standardize on ref.nextSibling for all refs // Note: `insertBefore` is used instead of `appendChild`, for safety re: http://www.paulirish.com/2011/surefire-dom-element-insertion/ ref.parentNode.insertBefore( ss, ( before ? ref : ref.nextSibling ) ); // A method (exposed on return object for external use) that mimics onload by polling until document.styleSheets until it includes the new sheet. ss.onloadcssdefined = function( cb ){ var defined; for( var i = 0; i < sheets.length; i++ ){ if( sheets[ i ].href && sheets[ i ].href === ss.href ){ defined = true; } } if( defined ){ cb(); } else { setTimeout(function() { ss.onloadcssdefined( cb ); }); } }; // once loaded, set link's media back to `all` so that the stylesheet applies once it loads ss.onloadcssdefined(function() { ss.media = media || "all"; }); return ss; };
}(this));