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

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;
});