You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
5.4 KiB
171 lines
5.4 KiB
4 years ago
|
/**
|
||
|
* @license RequireJS domReady 1.0.0 Copyright (c) 2010-2011, The Dojo Foundation All Rights Reserved.
|
||
|
* Available via the MIT or new BSD license.
|
||
|
* see: http://github.com/jrburke/requirejs for details
|
||
|
*/
|
||
|
/*jslint strict: false, plusplus: false */
|
||
|
/*global require: false, define: false, requirejs: false,
|
||
|
window: false, clearInterval: false, document: false,
|
||
|
self: false, setInterval: false */
|
||
|
|
||
|
|
||
|
define(function () {
|
||
|
var isBrowser = typeof window !== "undefined" && window.document,
|
||
|
isPageLoaded = !isBrowser,
|
||
|
doc = isBrowser ? document : null,
|
||
|
readyCalls = [],
|
||
|
readyLoaderCalls = [],
|
||
|
//Bind to a specific implementation, but if not there, try a
|
||
|
//a generic one under the "require" name.
|
||
|
req = requirejs || require || {},
|
||
|
oldResourcesReady = req.resourcesReady,
|
||
|
scrollIntervalId;
|
||
|
|
||
|
function runCallbacks(callbacks) {
|
||
|
for (var i = 0, callback; (callback = callbacks[i]); i++) {
|
||
|
callback(doc);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function callReady() {
|
||
|
var callbacks = readyCalls,
|
||
|
loaderCallbacks = readyLoaderCalls;
|
||
|
|
||
|
if (isPageLoaded) {
|
||
|
//Call the DOM ready callbacks
|
||
|
if (callbacks.length) {
|
||
|
readyCalls = [];
|
||
|
runCallbacks(callbacks);
|
||
|
}
|
||
|
|
||
|
//Now handle DOM ready + loader ready callbacks.
|
||
|
if (req.resourcesDone && loaderCallbacks.length) {
|
||
|
readyLoaderCalls = [];
|
||
|
runCallbacks(loaderCallbacks);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Add a method to require to get callbacks if there are loader resources still
|
||
|
* being loaded. If so, then hold off calling "withResources" callbacks.
|
||
|
*
|
||
|
* @param {Boolean} isReady: pass true if all resources have been loaded.
|
||
|
*/
|
||
|
if ('resourcesReady' in req) {
|
||
|
req.resourcesReady = function (isReady) {
|
||
|
//Call the old function if it is around.
|
||
|
if (oldResourcesReady) {
|
||
|
oldResourcesReady(isReady);
|
||
|
}
|
||
|
|
||
|
if (isReady) {
|
||
|
callReady();
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the page as loaded.
|
||
|
*/
|
||
|
function pageLoaded() {
|
||
|
if (!isPageLoaded) {
|
||
|
isPageLoaded = true;
|
||
|
if (scrollIntervalId) {
|
||
|
clearInterval(scrollIntervalId);
|
||
|
}
|
||
|
|
||
|
callReady();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (isBrowser) {
|
||
|
if (document.addEventListener) {
|
||
|
//Standards. Hooray! Assumption here that if standards based,
|
||
|
//it knows about DOMContentLoaded.
|
||
|
document.addEventListener("DOMContentLoaded", pageLoaded, false);
|
||
|
window.addEventListener("load", pageLoaded, false);
|
||
|
} else if (window.attachEvent) {
|
||
|
window.attachEvent("onload", pageLoaded);
|
||
|
|
||
|
//DOMContentLoaded approximation, as found by Diego Perini:
|
||
|
//http://javascript.nwbox.com/IEContentLoaded/
|
||
|
if (self === self.top) {
|
||
|
scrollIntervalId = setInterval(function () {
|
||
|
try {
|
||
|
//From this ticket:
|
||
|
//http://bugs.dojotoolkit.org/ticket/11106,
|
||
|
//In IE HTML Application (HTA), such as in a selenium test,
|
||
|
//javascript in the iframe can't see anything outside
|
||
|
//of it, so self===self.top is true, but the iframe is
|
||
|
//not the top window and doScroll will be available
|
||
|
//before document.body is set. Test document.body
|
||
|
//before trying the doScroll trick.
|
||
|
if (document.body) {
|
||
|
document.documentElement.doScroll("left");
|
||
|
pageLoaded();
|
||
|
}
|
||
|
} catch (e) {}
|
||
|
}, 30);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Check if document already complete, and if so, just trigger page load
|
||
|
//listeners.
|
||
|
if (document.readyState === "complete") {
|
||
|
pageLoaded();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** START OF PUBLIC API **/
|
||
|
|
||
|
/**
|
||
|
* Registers a callback for DOM ready. If DOM is already ready, the
|
||
|
* callback is called immediately.
|
||
|
* @param {Function} callback
|
||
|
*/
|
||
|
function domReady(callback) {
|
||
|
if (isPageLoaded) {
|
||
|
callback(doc);
|
||
|
} else {
|
||
|
readyCalls.push(callback);
|
||
|
}
|
||
|
return domReady;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Callback that waits for DOM ready as well as any outstanding
|
||
|
* loader resources. Useful when there are implicit dependencies.
|
||
|
* This method should be avoided, and always use explicit
|
||
|
* dependency resolution, with just regular DOM ready callbacks.
|
||
|
* The callback passed to this method will be called immediately
|
||
|
* if the DOM and loader are already ready.
|
||
|
* @param {Function} callback
|
||
|
*/
|
||
|
domReady.withResources = function (callback) {
|
||
|
if (isPageLoaded && req.resourcesDone) {
|
||
|
callback(doc);
|
||
|
} else {
|
||
|
readyLoaderCalls.push(callback);
|
||
|
}
|
||
|
return domReady;
|
||
|
};
|
||
|
|
||
|
domReady.version = '1.0.0';
|
||
|
|
||
|
/**
|
||
|
* Loader Plugin API method
|
||
|
*/
|
||
|
domReady.load = function (name, req, onLoad, config) {
|
||
|
if (config.isBuild) {
|
||
|
onLoad(null);
|
||
|
} else {
|
||
|
domReady(onLoad);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/** END OF PUBLIC API **/
|
||
|
|
||
|
return domReady;
|
||
|
});
|