Last active
September 7, 2023 23:29
-
-
Save magnetikonline/5270265 to your computer and use it in GitHub Desktop.
My standalone cross browser "DOM is ready" function.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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