ガブリエルガルシアがMutationObserversについて言及したことは正しい方向に進んでいますが、私にとってはうまくいきませんでした。それがブラウザの癖によるものなのか、それとも自分のミスによるものなのかはわかりませんが、私のために機能するようになったバージョンは次のとおりです。
document.addEventListener("DOMContentLoaded", function(event) {
var observer = new MutationObserver(mutations=>{
mutations.map(mutation=>{
Array.from(mutation.addedNodes).map(node=>{
if (node.tagName === "SCRIPT") {
var s = document.createElement("script");
s.text=node.text;
if (typeof(node.parentElement.added) === 'undefined')
node.parentElement.added = [];
node.parentElement.added[node.parentElement.added.length] = s;
node.parentElement.removeChild(node);
document.head.appendChild(s);
}
})
})
})
observer.observe(document.getElementById("element_to_watch"), {childList: true, subtree: true,attributes: false});
};
もちろん、element_to_watch
変更する要素の名前に置き換える必要があります。
node.parentElement.added
に追加されるスクリプトタグを格納するために使用されdocument.head
ます。外部ページの読み込みに使用される関数では、次のようなものを使用して、関連のなくなったスクリプトタグを削除できます。
function freeScripts(node){
if (node === null)
return;
if (typeof(node.added) === 'object') {
for (var script in node.added) {
document.head.removeChild(node.added[script]);
}
node.added = {};
}
for (var child in node.children) {
freeScripts(node.children[child]);
}
}
そして、ロード関数の始まりの例:
function load(url, id, replace) {
if (document.getElementById(id) === null) {
console.error("Element of ID "+id + " does not exist!");
return;
}
freeScripts(document.getElementById(id));
var xhttp = new XMLHttpRequest();
// proceed to load in the page and modify innerHTML
}