Skip to content

Instantly share code, notes, and snippets.

@bgerrissen
Created May 24, 2011 09:05
Show Gist options
  • Save bgerrissen/988390 to your computer and use it in GitHub Desktop.
Save bgerrissen/988390 to your computer and use it in GitHub Desktop.
Robust cross browser JS Loader for dependency management.
/**
* Author: Ben Gerrissen
* Date: 9-3-11
* License: MIT
*/
(function( global ){
var undefined
, preloads = false
, queue = []
, scriptNode = document.createElement( "script" )
, anchorNode = document.getElementsByTagName( "script" )[0]
, testNode
, tid
;
scriptNode.async = true;
testNode = scriptNode.cloneNode( true);
testNode.onload = testNode.onreadystatechange = function(){
preloads = true;
proceed();
};
// browser that preload scripts, will fire 'onreadystatechange:loaded'
testNode.src = "javascript:void()";
// 'onreadystatechange' fires immediatly after script execution, so we need to wait for it.
tid = setTimeout( proceed , 9 );
function proceed(){
// now we should know if a browser preloads, lets proceed
clearTimeout( tid );
var q = queue;
queue = undefined;
while( q.length ) {
loadScript.apply( null , q.pop() );
}
testNode = testNode.onload = testNode.onreadystatechange = null;
}
function append( node ){
anchorNode.parentNode.insertBefore( node , anchorNode );
}
// src should be resolved before loadScript is called.
// so loadScript expects complete and valid urls
function loadScript( src , callback ){
if ( queue ) {
queue.push( arguments );
return;
}
var node = scriptNode.cloneNode(true)
, listener = function(){
var node = listener.node;
if(!node.readyState || !/in/.test( node.readyState ) ) {
if ( preloads ) {
// after appending, script executes immediatly.
// and current program seems to be put on hold till script is done.
// cool.
append( node );
node.onload = node.onreadystatechange = null;
}
callback();
}
node = null;
};
listener.node = node;
node.onload = node.onreadystatechange = listener;
node.src = src;
if ( !preloads ){
append( node );
}
node = null;
}
global.loadScript = loadScript;
}( this ));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment