[76] | 1 | /*! |
---|
| 2 | * Ext JS Library 3.4.0 |
---|
| 3 | * Copyright(c) 2006-2011 Sencha Inc. |
---|
| 4 | * licensing@sencha.com |
---|
| 5 | * http://www.sencha.com/license |
---|
| 6 | */ |
---|
| 7 | /** |
---|
| 8 | * @class Ext.Loader |
---|
| 9 | * @singleton |
---|
| 10 | * Simple class to help load JavaScript files on demand |
---|
| 11 | */ |
---|
| 12 | Ext.Loader = Ext.apply({}, { |
---|
| 13 | /** |
---|
| 14 | * Loads a given set of .js files. Calls the callback function when all files have been loaded |
---|
| 15 | * Set preserveOrder to true to ensure non-parallel loading of files if load order is important |
---|
| 16 | * @param {Array} fileList Array of all files to load |
---|
| 17 | * @param {Function} callback Callback to call after all files have been loaded |
---|
| 18 | * @param {Object} scope The scope to call the callback in |
---|
| 19 | * @param {Boolean} preserveOrder True to make files load in serial, one after the other (defaults to false) |
---|
| 20 | */ |
---|
| 21 | load: function(fileList, callback, scope, preserveOrder) { |
---|
| 22 | var scope = scope || this, |
---|
| 23 | head = document.getElementsByTagName("head")[0], |
---|
| 24 | fragment = document.createDocumentFragment(), |
---|
| 25 | numFiles = fileList.length, |
---|
| 26 | loadedFiles = 0, |
---|
| 27 | me = this; |
---|
| 28 | |
---|
| 29 | /** |
---|
| 30 | * Loads a particular file from the fileList by index. This is used when preserving order |
---|
| 31 | */ |
---|
| 32 | var loadFileIndex = function(index) { |
---|
| 33 | head.appendChild( |
---|
| 34 | me.buildScriptTag(fileList[index], onFileLoaded) |
---|
| 35 | ); |
---|
| 36 | }; |
---|
| 37 | |
---|
| 38 | /** |
---|
| 39 | * Callback function which is called after each file has been loaded. This calls the callback |
---|
| 40 | * passed to load once the final file in the fileList has been loaded |
---|
| 41 | */ |
---|
| 42 | var onFileLoaded = function() { |
---|
| 43 | loadedFiles ++; |
---|
| 44 | |
---|
| 45 | //if this was the last file, call the callback, otherwise load the next file |
---|
| 46 | if (numFiles == loadedFiles && typeof callback == 'function') { |
---|
| 47 | callback.call(scope); |
---|
| 48 | } else { |
---|
| 49 | if (preserveOrder === true) { |
---|
| 50 | loadFileIndex(loadedFiles); |
---|
| 51 | } |
---|
| 52 | } |
---|
| 53 | }; |
---|
| 54 | |
---|
| 55 | if (preserveOrder === true) { |
---|
| 56 | loadFileIndex.call(this, 0); |
---|
| 57 | } else { |
---|
| 58 | //load each file (most browsers will do this in parallel) |
---|
| 59 | Ext.each(fileList, function(file, index) { |
---|
| 60 | fragment.appendChild( |
---|
| 61 | this.buildScriptTag(file, onFileLoaded) |
---|
| 62 | ); |
---|
| 63 | }, this); |
---|
| 64 | |
---|
| 65 | head.appendChild(fragment); |
---|
| 66 | } |
---|
| 67 | }, |
---|
| 68 | |
---|
| 69 | /** |
---|
| 70 | * @private |
---|
| 71 | * Creates and returns a script tag, but does not place it into the document. If a callback function |
---|
| 72 | * is passed, this is called when the script has been loaded |
---|
| 73 | * @param {String} filename The name of the file to create a script tag for |
---|
| 74 | * @param {Function} callback Optional callback, which is called when the script has been loaded |
---|
| 75 | * @return {Element} The new script ta |
---|
| 76 | */ |
---|
| 77 | buildScriptTag: function(filename, callback) { |
---|
| 78 | var script = document.createElement('script'); |
---|
| 79 | script.type = "text/javascript"; |
---|
| 80 | script.src = filename; |
---|
| 81 | |
---|
| 82 | //IE has a different way of handling <script> loads, so we need to check for it here |
---|
| 83 | if (script.readyState) { |
---|
| 84 | script.onreadystatechange = function() { |
---|
| 85 | if (script.readyState == "loaded" || script.readyState == "complete") { |
---|
| 86 | script.onreadystatechange = null; |
---|
| 87 | callback(); |
---|
| 88 | } |
---|
| 89 | }; |
---|
| 90 | } else { |
---|
| 91 | script.onload = callback; |
---|
| 92 | } |
---|
| 93 | |
---|
| 94 | return script; |
---|
| 95 | } |
---|
| 96 | }); |
---|