Skip to content

Commit

Permalink
Fix for race condition in readystate detection (#1972)
Browse files Browse the repository at this point in the history
* trying to fix readystate race condition

* es6 to es5

* serialized intitialization routines

* encapsulating ready function call
  • Loading branch information
ahollandECS committed Nov 20, 2023
1 parent 0b37d05 commit 78a9ecf
Showing 1 changed file with 26 additions and 17 deletions.
43 changes: 26 additions & 17 deletions src/htmx.js
Original file line number Diff line number Diff line change
Expand Up @@ -3752,25 +3752,34 @@ return (function () {
//====================================================================
// Initialization
//====================================================================
var isReady = false
getDocument().addEventListener('DOMContentLoaded', function() {
isReady = true
})

/**
* Execute a function now if DOMContentLoaded has fired, otherwise listen for it.
*
* This function uses isReady because there is no realiable way to ask the browswer whether
* the DOMContentLoaded event has already been fired; there's a gap between DOMContentLoaded
* firing and readystate=complete.
* We want to initialize the page elements after DOMContentLoaded
* fires, but there isn't always a good way to tell whether
* it has already fired when we get here or not.
*/
function ready(fn) {
// Checking readyState here is a failsafe in case the htmx script tag entered the DOM by
// some means other than the initial page load.
if (isReady || getDocument().readyState === 'complete') {
fn();
} else {
getDocument().addEventListener('DOMContentLoaded', fn);
function ready(functionToCall) {
// call the function exactly once no matter how many times this is called
var callReadyFunction = function() {
if (!functionToCall) return;
functionToCall();
functionToCall = null;
};

if (getDocument().readyState === "complete") {
// DOMContentLoaded definitely fired, we can initialize the page
callReadyFunction();
}
else {
/* DOMContentLoaded *maybe* already fired, wait for
* the next DOMContentLoaded or readystatechange event
*/
getDocument().addEventListener("DOMContentLoaded", function() {
callReadyFunction();
});
getDocument().addEventListener("readystatechange", function() {
if (getDocument().readyState !== "complete") return;
callReadyFunction();
});
}
}

Expand Down

0 comments on commit 78a9ecf

Please sign in to comment.