JavaScript将html写入iframe-即不加载外部脚本或弄乱编码



我想使用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>

在Firefox和Chrome中,上述工作正常,但是在IE8中,由于未执行外部脚本而失败。

我找到了一个看起来像这样的解决方法:

iFrame.contentWindow.contents = htmlString;
iFrame.src = 'javascript:window["contents"]';

似乎在所有主要浏览器中都起作用。外部脚本应按照应有的方式加载。但是,如果HTML文档包含任何特殊字符(例如中文),则文本最终会在IE中乱七八糟。一切都是UTF-8,它在其他浏览器中效果很好,IE设置为在UTF-8中渲染页面,但是IFRAME中的文本已乱七八糟。

因此,我有一个解决方案,显示具有正确编码的文本,但不会加载外部脚本;还有另一种加载外部脚本但插入文本的解决方案。关于解决这两个问题的解决方案的任何建议?

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

我想出了一个解决方法。我敢肯定那里有一个更好的解决方案,但暂时似乎有效:

首先,我在HTML字符串中操纵所有脚本标签,以免执行它们。我用" XSRC"将" SRC"属性替换为" Xinnertext"属性。然后,我使用iframedoc.write(HTMLString)方法将HTML字符串写入IFRAME。编码都是正确的,并且没有执行脚本。

然后,我使用jQuery逐一浏览所有脚本。我手动重新创建一个脚本(iframedoc.createelement('script')),并将其附加到正确的位置(在操纵脚本标签旁边)。

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

不是最佳的,但它在IE8中起作用。

最新更新