forked from dojo/dojo-oldmirror
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ready.js
128 lines (116 loc) · 3.44 KB
/
ready.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
define(["./_base/kernel", "./has", "require", "./has!host-browser?./domReady", "./_base/lang"], function(dojo, has, require, domReady, lang) {
// module:
// dojo/ready
// summary:
// This module defines the dojo.ready API.
//
// note:
// This module should be unnecessary in dojo 2.0
var
// truthy if DOMContentLoaded or better (e.g., window.onload fired) has been achieved
isDomReady = 0,
// a function to call to cause onLoad to be called when all requested modules have been loaded
requestCompleteSignal,
// The queue of functions waiting to execute as soon as dojo.ready conditions satisfied
loadQ = [],
// prevent recursion in onLoad
onLoadRecursiveGuard = 0,
handleDomReady = function(){
isDomReady = 1;
dojo._postLoad = dojo.config.afterOnLoad = true;
if(loadQ.length){
requestCompleteSignal(onLoad);
}
},
// run the next function queued with dojo.ready
onLoad = function(){
if(isDomReady && !onLoadRecursiveGuard && loadQ.length){
//guard against recursions into this function
onLoadRecursiveGuard = 1;
var f = loadQ.shift();
try{
f();
}
// FIXME: signal the error via require.on
finally{
onLoadRecursiveGuard = 0;
}
onLoadRecursiveGuard = 0;
if(loadQ.length){
requestCompleteSignal(onLoad);
}
}
};
require.on("idle", onLoad);
requestCompleteSignal = function(){
if(require.idle()){
onLoad();
} // else do nothing, onLoad will be called with the next idle signal
};
var ready = dojo.ready = dojo.addOnLoad = function(priority, context, callback){
// summary: Add a function to execute on DOM content loaded and all requested modules have arrived and been evaluated.
// priority: Integer?
// The order in which to exec this callback relative to other callbacks, defaults to 1000
// context: Object?|Function
// The context in which to run execute callback, or a callback if not using context
// callback: Function?
// The function to execute.
//
// example:
// Simple DOM and Modules ready syntax
// | dojo.ready(function(){ alert("Dom ready!"); });
//
// example:
// Using a priority
// | dojo.ready(2, function(){ alert("low priority ready!"); })
//
// example:
// Using context
// | dojo.ready(foo, function(){
// | // in here, this == foo
// | })
//
// example:
// Using dojo.hitch style args:
// | var foo = { dojoReady: function(){ console.warn(this, "dojo dom and modules ready."); } };
// | dojo.ready(foo, "dojoReady");
var hitchArgs = lang._toArray(arguments);
if(typeof priority != "number"){
callback = context;
context = priority;
priority = 1000;
}else{
hitchArgs.shift();
}
callback = callback ?
lang.hitch.apply(dojo, hitchArgs) :
function(){
context();
};
callback.priority = priority;
for(var i = 0; i < loadQ.length && priority >= loadQ[i].priority; i++){}
loadQ.splice(i, 0, callback);
requestCompleteSignal();
};
has.add("dojo-config-addOnLoad", 1);
if(has("dojo-config-addOnLoad")){
var dca = dojo.config.addOnLoad;
if(dca){
ready[(lang.isArray(dca) ? "apply" : "call")](dojo, dca);
}
}
if(has("dojo-sync-loader") && dojo.config.parseOnLoad && !dojo.isAsync){
ready(99, function(){
if(!dojo.parser){
dojo.deprecated("Add explicit require(['dojo/parser']);", "", "2.0");
require(["dojo/parser"]);
}
});
}
if(has("host-browser")){
domReady(handleDomReady);
}else{
handleDomReady();
}
return ready;
});