Created
May 24, 2011 09:05
-
-
Save bgerrissen/988390 to your computer and use it in GitHub Desktop.
Robust cross browser JS Loader for dependency management.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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