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