JavaScript将HTML写入iFrame-即不加载外部脚本,或弄乱编码
我想使用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进行测试,不确定其他版本),那么它将失
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。