JavaScript将HTML写入iFrame-即不加载外部脚本,或弄乱编码

JavaScript将HTML写入iFrame-即不加载外部脚本,或弄乱编码,javascript,Javascript,我想使用JavaScript将完整的HTML文档写入iframe。以下解决方案在大多数情况下都能很好地工作: var iFrameDoc = iFrame.contentDocument || iFrame.contentWindow.document; iFrameDoc.open(); iFrameDoc.write(htmlString); iFrameDoc.close(); 但是,如果HTML文档包含对外部脚本的引用,并且浏览器是IE(使用IE8进行测试,不确定其他版本),那么它将失

我想使用JavaScript将完整的HTML文档写入iframe。以下解决方案在大多数情况下都能很好地工作:

var iFrameDoc = iFrame.contentDocument || iFrame.contentWindow.document;
iFrameDoc.open();
iFrameDoc.write(htmlString);
iFrameDoc.close();
但是,如果HTML文档包含对外部脚本的引用,并且浏览器是IE(使用IE8进行测试,不确定其他版本),那么它将失败。例如,类似以下内容的HTML文档:

<html>
 <head>
  <script src="script.js"></script>
 </head>
 <body>
  <script>alert(variableFromExternalScript)</script>
 </body>
</html>
iFrame.contentWindow.contents = htmlString;
iFrame.src = 'javascript:window["contents"]';
这似乎适用于所有主流浏览器。外部脚本按其应该的方式加载。但是,如果HTML文档包含任何特殊字符(如中文),则文本最终会在IE中被乱码。所有内容都是UTF-8,在其他浏览器中运行良好,IE设置为以UTF-8呈现页面,但iFrame中的文本被乱码

所以,我有一个解决方案,它用正确的编码显示文本,但不加载外部脚本;另一个解决方案是加载外部脚本,但会弄乱文本。对解决这两个问题的解决方案有什么建议吗


HTML文档是动态加载的,因此我无法对其进行更改,例如删除外部脚本。

我想出了一个解决方法。我相信有更好的解决方案,但目前看来,这似乎是可行的:

首先,我操纵HTML字符串中的所有脚本标记,以便它们不会被执行。我将“src”属性替换为“xsrc”,将所有内部文本替换为“xinnertext”属性。然后我使用iFrameDoc.write(htmlString)方法将HTML字符串写入iFrame。编码完全正确,没有执行脚本

然后,我使用jQuery逐个检查所有脚本。我手动重新创建一个脚本(iFrameDoc.createElement('script'))并将其附加到DOM的正确位置(在操纵的脚本标记旁边)

我使用加载事件来确保在执行下一个脚本之前加载每个脚本


不是最优的,但它在IE8中有效。

这是一个很好的、经过深思熟虑的问题。虽然我无能为力,但我肯定会+1。