我想使用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中起作用。