JavaScriptで、HTMLテキストをもとにDOMを追加する場合、例えば、
const doctext = `<script>alert("test")</script>`
document.getElementById("aaa").innerHTML = doctext;
のように、innerHTMLでDOMを追加した時には、scriptタグを追加しても実行されません。そこで、HTMLの中身のscriptタグ全てを実行するようにHTMLを追加するコードを紹介します。
scriptタグを実行しながらHTMLを追加する関数
ES6に対応しています。
window.setInnerHTML = function(elm, html) {
elm.innerHTML = html;
Array.from(elm.querySelectorAll("script")).forEach( oldScript => {
const newScript = document.createElement("script");
Array.from(oldScript.attributes)
.forEach( attr => newScript.setAttribute(attr.name, attr.value) );
newScript.appendChild(document.createTextNode(oldScript.innerHTML));
oldScript.parentNode.replaceChild(newScript, oldScript);
});
}
使い方
const doctext = `<script>alert("test")</script>`
setInnerHTML(document.getElementById("aaa"),doctext);
