diff --git a/mithril.js b/mithril.js index d7054596..9478add4 100644 --- a/mithril.js +++ b/mithril.js @@ -1176,9 +1176,41 @@ $document.createRange().createContextualFragment(data)) } catch (e) { parentElement.insertAdjacentHTML("beforeend", data) + replaceScriptNodes(parentElement) } } + // Replace script tags inside given DOM element with executable ones. + // Will also check children recursively and replace any found script + // tags in same manner. + function replaceScriptNodes(node) { + if (node.tagName === "SCRIPT") { + node.parentNode.replaceChild(buildExecutableNode(node), node) + } else { + var children = node.childNodes + if (children && children.length) { + for (var i = 0; i < children.length; i++) { + replaceScriptNodes(children[i]) + } + } + } + + return node + } + + // Replace script element with one whose contents are executable. + function buildExecutableNode(node){ + var scriptEl = document.createElement("script") + var attrs = node.attributes + + for (var i = 0; i < attrs.length; i++) { + scriptEl.setAttribute(attrs[i].name, attrs[i].value) + } + + scriptEl.text = node.innerHTML + return scriptEl + } + function injectHTML(parentElement, index, data) { var nextSibling = parentElement.childNodes[index] if (nextSibling) { diff --git a/test/mithril.trust.js b/test/mithril.trust.js index 17727a0d..0acd94fa 100644 --- a/test/mithril.trust.js +++ b/test/mithril.trust.js @@ -65,5 +65,21 @@ describe("m.trust()", function () { expect(root.innerHTML) .to.equal("

&copy;

©

©
") }) + + // https://github.com/lhorie/mithril.js/issues/1045 + it("correctly injects script tags and executes them", function () { + var HTMLString = + "" + var root = document.createElement("div") + var child = document.createElement("div") + root.id = "root" + root.innerText = "Before" + root.appendChild(child) + document.body.appendChild(root) + + m.render(child, m.trust(HTMLString)) + + expect(root.innerText).to.equal("After") + }) }) })