Skip to content

Instantly share code, notes, and snippets.

@magnetikonline
Last active September 7, 2023 23:29
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save magnetikonline/5270265 to your computer and use it in GitHub Desktop.
Save magnetikonline/5270265 to your computer and use it in GitHub Desktop.
My standalone cross browser "DOM is ready" function.
// Standalone DOM ready utility function
// Parts lifted from the following places:
// https://code.jquery.com/jquery-1.9.1.js
// https://github.com/ded/domready/blob/master/ready.js
// usage:
// domReady(function() { console.log('DOM is ready!'); });
// domReady(function() { console.log('Another method called upon DOM being ready'); });
(function(win,doc) {
var docEl = doc.documentElement,
readyHandlerList,
realEventModel = !!win.addEventListener,
readyStateRegExp = /^(loade|c)/,
DOMIsReady = readyStateRegExp.test(doc.readyState),
DOMContentLoadedEvent = 'DOMContentLoaded',
onReadyStateChangeEvent = 'onreadystatechange';
win.domReady = function(handler) {
// if DOM ready call handler right away
if (DOMIsReady) return handler();
if (!readyHandlerList) {
// init events
if (realEventModel) {
doc.addEventListener(DOMContentLoadedEvent,readyHandler,false);
win.addEventListener('load',readyHandler,false);
} else {
// Internet Explorer event model
doc.attachEvent(onReadyStateChangeEvent,readyHandler);
win.attachEvent('onload',readyHandler);
// doScroll() hack for Internet Explorer < 9, (it should) fire earlier than 'onreadystatechange'
// this will fail (badly) if used inside an iframe - so don't
if (docEl.doScroll) {
(function doScrollCheck() {
if (!DOMIsReady) {
try {
docEl.doScroll('left');
} catch (e) {
return setTimeout(doScrollCheck,50);
}
DOMIsReady = true;
readyHandler();
}
})();
}
}
readyHandlerList = [];
}
// add handler to stack
readyHandlerList.push(handler);
};
function readyHandler(event) {
if (realEventModel || DOMIsReady || (event.type == 'load') || (readyStateRegExp.test(doc.readyState))) {
// detach events
if (realEventModel) {
doc.removeEventListener(DOMContentLoadedEvent,readyHandler,false);
win.removeEventListener('load',readyHandler,false);
} else {
doc.detachEvent(onReadyStateChangeEvent,readyHandler);
win.detachEvent('onload',readyHandler);
}
// process handler stack
while (readyHandlerList.length) readyHandlerList.shift()();
DOMIsReady = true;
}
}
})(window,document);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment