130 lines
3.9 KiB
JavaScript
130 lines
3.9 KiB
JavaScript
/**
|
|
* @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
|
|
* Available via the MIT or new BSD license.
|
|
* see: http://github.com/requirejs/domReady for details
|
|
*/
|
|
/*jslint */
|
|
/*global require: false, define: false, requirejs: false,
|
|
window: false, clearInterval: false, document: false,
|
|
self: false, setInterval: false */
|
|
|
|
|
|
define(function () {
|
|
'use strict';
|
|
|
|
var isTop, testDiv, scrollIntervalId,
|
|
isBrowser = typeof window !== "undefined" && window.document,
|
|
isPageLoaded = !isBrowser,
|
|
doc = isBrowser ? document : null,
|
|
readyCalls = [];
|
|
|
|
function runCallbacks(callbacks) {
|
|
var i;
|
|
for (i = 0; i < callbacks.length; i += 1) {
|
|
callbacks[i](doc);
|
|
}
|
|
}
|
|
|
|
function callReady() {
|
|
var callbacks = readyCalls;
|
|
|
|
if (isPageLoaded) {
|
|
//Call the DOM ready callbacks
|
|
if (callbacks.length) {
|
|
readyCalls = [];
|
|
runCallbacks(callbacks);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
|
|
testDiv = document.createElement('div');
|
|
try {
|
|
isTop = window.frameElement === null;
|
|
} catch (e) {}
|
|
|
|
//DOMContentLoaded approximation that uses a doScroll, as found by
|
|
//Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,
|
|
//but modified by other contributors, including jdalton
|
|
if (testDiv.doScroll && isTop && window.external) {
|
|
scrollIntervalId = setInterval(function () {
|
|
try {
|
|
testDiv.doScroll();
|
|
pageLoaded();
|
|
} catch (e) {}
|
|
}, 30);
|
|
}
|
|
}
|
|
|
|
//Check if document already complete, and if so, just trigger page load
|
|
//listeners. Latest webkit browsers also use "interactive", and
|
|
//will fire the onDOMContentLoaded before "interactive" but not after
|
|
//entering "interactive" or "complete". More details:
|
|
//http://dev.w3.org/html5/spec/the-end.html#the-end
|
|
//http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded
|
|
//Hmm, this is more complicated on further use, see "firing too early"
|
|
//bug: https://github.com/requirejs/domReady/issues/1
|
|
//so removing the || document.readyState === "interactive" test.
|
|
//There is still a window.onload binding that should get fired if
|
|
//DOMContentLoaded is missed.
|
|
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;
|
|
}
|
|
|
|
domReady.version = '2.0.1';
|
|
|
|
/**
|
|
* 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;
|
|
});
|