我想用JavaScript来写一个完整的超文本标记语言文档到iframe。以下解决方案在大多数情况下都能很好地工作:
var iFrameDoc = iFrame.contentDocument || iFrame.contentWindow.document;
iFrameDoc.open();
iFrameDoc.write(htmlString);
iFrameDoc.close();但是,如果超文本标记语言文档包含对外部脚本的引用,并且浏览器是IE (使用IE8进行测试,不确定是否有其他版本),则会失败。例如,如下所示的HTML文档:
<html>
<head>
<script src="script.js"></script>
</head>
<body>
<script>alert(variableFromExternalScript)</script>
</body>
</html>在火狐和Chrome中,上述功能运行良好,但在IE8中,由于未执行外部脚本,因此无法正常运行。
我找到了一个解决方法,看起来像这样:
iFrame.contentWindow.contents = htmlString;
iFrame.src = 'javascript:window["contents"]';这似乎适用于所有主流浏览器。外部脚本按其应有的方式加载。但是,如果HTML文档包含任何特殊的特殊字符(如中文),则文本在IE中会乱码。一切都是UTF-8,它在其他浏览器中运行良好,IE被设置为以UTF-8呈现页面,但是iFrame中的文本是乱码。
因此,我有一个解决方案可以使用正确的编码显示文本,但不加载外部脚本;另一个解决方案可以加载外部脚本,但会篡改文本。有什么建议可以解决这两个问题吗?
HTML文档是动态加载的,所以我不能对其进行更改,比如删除外部脚本。
发布于 2014-01-27 20:19:22
我想出了一个变通办法。我确信有一个更好的解决方案,但就目前而言,这似乎是有效的:
首先,我操作HTML字符串中的所有脚本标记,这样它们就不会被执行。我将"src“属性替换为"xsrc",将所有内部文本替换为"xinnertext”属性。然后使用iFrameDoc.write(htmlString)方法将HTML字符串写入iFrame。编码都是正确的,并且没有执行任何脚本。
然后,我使用jQuery逐个遍历所有脚本。我手动重新创建了一个脚本(iFrameDoc.createElement(' script ')),并将其附加到DOM的正确位置(在被操纵的脚本标记旁边)。
我使用加载事件来确保在执行下一个脚本之前加载每个脚本。
不是最优的,但它在IE8中工作。
https://stackoverflow.com/questions/21307098
复制相似问题