source: Dev/trunk/src/client/dojo/ready.js

Last change on this file was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 4.5 KB
RevLine 
[483]1define(["./_base/kernel", "./has", "require", "./has!host-browser?./domReady", "./_base/lang"], function(dojo, has, require, domReady, lang){
2        // module:
3        //              dojo/ready
4        // note:
5        //              This module should be unnecessary in dojo 2.0
6
7        var
8                // truthy if DOMContentLoaded or better (e.g., window.onload fired) has been achieved
9                isDomReady = 0,
10
11                // The queue of functions waiting to execute as soon as dojo.ready conditions satisfied
12                loadQ = [],
13
14                // prevent recursion in onLoad
15                onLoadRecursiveGuard = 0,
16
17                handleDomReady = function(){
18                        isDomReady = 1;
19                        dojo._postLoad = dojo.config.afterOnLoad = true;
20                        onEvent();
21                },
22
23                onEvent = function(){
24                        // Called when some state changes:
25                        //              - dom ready
26                        //              - dojo/domReady has finished processing everything in its queue
27                        //              - task added to loadQ
28                        //              - require() has finished loading all currently requested modules
29                        //
30                        // Run the functions queued with dojo.ready if appropriate.
31
32
33                        //guard against recursions into this function
34                        if(onLoadRecursiveGuard){
35                                return;
36                        }
37                        onLoadRecursiveGuard = 1;
38
39                        // Run tasks in queue if require() is finished loading modules, the dom is ready, and there are no
40                        // pending tasks registered via domReady().
41                        // The last step is necessary so that a user defined dojo.ready() callback is delayed until after the
42                        // domReady() calls inside of dojo.       Failure can be seen on dijit/tests/robot/Dialog_ally.html on IE8
43                        // because the dijit/focus.js domReady() callback doesn't execute until after the test starts running.
44                        while(isDomReady && (!domReady || domReady._Q.length == 0) && (require.idle ? require.idle() : true) && loadQ.length){
45                                var f = loadQ.shift();
46                                try{
47                                        f();
48                                }catch(e){
49                                        // force the dojo.js on("error") handler do display the message
50                                        e.info = e.message;
51                                        if(require.signal){
52                                                require.signal("error", e);
53                                        }else{
54                                                throw e;
55                                        }
56                                }
57                        }
58
59                        onLoadRecursiveGuard = 0;
60                };
61
62        // Check if we should run the next queue operation whenever require() finishes loading modules or domReady
63        // finishes processing it's queue.
64        require.on && require.on("idle", onEvent);
65        if(domReady){
66                domReady._onQEmpty = onEvent;
67        }
68
69        var ready = dojo.ready = dojo.addOnLoad = function(priority, context, callback){
70                // summary:
71                //              Add a function to execute on DOM content loaded and all requested modules have arrived and been evaluated.
72                //              In most cases, the `domReady` plug-in should suffice and this method should not be needed.
73                //
74                //              When called in a non-browser environment, just checks that all requested modules have arrived and been
75                //              evaluated.
76                // priority: Integer?
77                //              The order in which to exec this callback relative to other callbacks, defaults to 1000
78                // context: Object?|Function
79                //              The context in which to run execute callback, or a callback if not using context
80                // callback: Function?
81                //              The function to execute.
82                //
83                // example:
84                //      Simple DOM and Modules ready syntax
85                //      |       require(["dojo/ready"], function(ready){
86                //      |               ready(function(){ alert("Dom ready!"); });
87                //      |       });
88                //
89                // example:
90                //      Using a priority
91                //      |       require(["dojo/ready"], function(ready){
92                //      |               ready(2, function(){ alert("low priority ready!"); })
93                //      |       });
94                //
95                // example:
96                //      Using context
97                //      |       require(["dojo/ready"], function(ready){
98                //      |               ready(foo, function(){
99                //      |                       // in here, this == foo
100                //      |               });
101                //      |       });
102                //
103                // example:
104                //      Using dojo/hitch style args:
105                //      |       require(["dojo/ready"], function(ready){
106                //      |               var foo = { dojoReady: function(){ console.warn(this, "dojo dom and modules ready."); } };
107                //      |               ready(foo, "dojoReady");
108                //      |       });
109
110                var hitchArgs = lang._toArray(arguments);
111                if(typeof priority != "number"){
112                        callback = context;
113                        context = priority;
114                        priority = 1000;
115                }else{
116                        hitchArgs.shift();
117                }
118                callback = callback ?
119                        lang.hitch.apply(dojo, hitchArgs) :
120                        function(){
121                                context();
122                        };
123                callback.priority = priority;
124                for(var i = 0; i < loadQ.length && priority >= loadQ[i].priority; i++){}
125                loadQ.splice(i, 0, callback);
126                onEvent();
127        };
128
129        has.add("dojo-config-addOnLoad", 1);
130        if(has("dojo-config-addOnLoad")){
131                var dca = dojo.config.addOnLoad;
132                if(dca){
133                        ready[(lang.isArray(dca) ? "apply" : "call")](dojo, dca);
134                }
135        }
136
137        if(has("dojo-sync-loader") && dojo.config.parseOnLoad && !dojo.isAsync){
138                ready(99, function(){
139                        if(!dojo.parser){
140                                dojo.deprecated("Add explicit require(['dojo/parser']);", "", "2.0");
141                                require(["dojo/parser"]);
142                        }
143                });
144        }
145
146        if(domReady){
147                domReady(handleDomReady);
148        }else{
149                handleDomReady();
150        }
151
152        return ready;
153});
Note: See TracBrowser for help on using the repository browser.