I am clicking on a link and loading in an html file which consist of:
<div id="galleryPage"> <p>Hello2</p> </div> <script type="text/javascript"> console.log("hellosdsd"); </script>
I then add this into a div on my page and it looks like:
the script never executes…
What am I missing?
Loading the html like this:
document.querySelectorAll(".link").forEach((item) => { item.addEventListener("click", (event) => { event.preventDefault(); const url = event.target.dataset["url"]; get_html_file(`./Pages/${url}/`, (data) => { document.getElementById("container").innerHTML = data; }); return false; }); }); function get_html_file(path, success, errorCallback) { fetch(path) .then((response) => { if (!response.ok) { throw new Error("Network response was not ok"); } return response.text(); }) .then((data) => { if (success) success(data); // document.getElementById("container").innerHTML = data; }) .catch((error) => { if (errorCallback) errorCallback(error); console.error( "There has been a problem with your fetch operation:", error ); }); }
Advertisement
Answer
Yep, modifying innerHTML
won’t evaluate the script tags it inserts.
You might want to do something like
[...document.querySelectorAll("#container script")].forEach(script => { if(script.dataset.evaluated) return; // If already evaluated, skip eval(script.innerText); script.dataset.evaluated = 1; // Mark as evaluated });
after you load in the new HTML.
You could also do e.g. script.parentNode.removeChild(script)
instead of the dataset trick, but this is more useful for debugging.