我的应用程序(正在开发中)使用 Safari 4.0.3 和 JavaScript 将其前端呈现给用户。后端是 PHP 和 SQLite。这是在 OS X 10.5.8 下。
该应用程序会不时接收 HTML block 以呈现给用户。每个 block 都是收到的电子邮件的正文,因此无法控制收到的 HTML 的质量。我所做的是使用 innerHTML 将 block 插入 iFrame 并让 Safari 呈现它。
为此,我这样做:
window.frames["mainwindow"].window.frames["Frame1"].document.body.innerHTML = myvar;
其中 myvar 包含接收到的 HTML。现在,在大多数情况下,这会按预期工作,并且 HTML 会按预期呈现。异常似乎是当 block 的标签如下所示时:
<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" ...
等等超过 2800 个字符。效果就好像我上面的 JavaScript 语句没有被执行一样——我可以看到在开发菜单中使用 Safari 的错误控制台来查看 iFrame。如果我从 SQLite 后端数据库中提取 HTML 并将其保存为 .html 文件,那么 Safari 将毫无问题地呈现它。
任何关于为什么会发生这种情况的评论,或关于 innerHTML 的这种使用,或对相同讨论的指示,将不胜感激。
最佳答案
innerHTML
和写一个完整的文档是不一样的。即使你按照 Gumbo 的建议写入 outerHTML
,根元素之外的东西也会混淆它,比如 doctypes。要一次编写整个文档,您必须使用老式的跨框架文档。写:
var d= window.frames["mainwindow"].window.frames["Frame1"].document;
d.open();
d.write(htmldoc);
d.close();
Each chunk is the body of an email received, and as such one has no control over the quality of the HTML received.
好的,那你可能遇到了安全问题。
如果您让诸如电子邮件之类的不受信任的来源将 HTML 注入(inject)您的安全上下文(并且您正在写入的 iframe 是 在您的安全上下文中),它可以运行自己的 JavaScript ,包括达到并控制整个封闭应用程序和同一主机名上的任何其他内容的脚本。除非您的应用程序非常微不足道您不关心它,否则这真的是个坏消息。
如果您需要允许不受信任的 HTML,许多网络邮件服务的做法是将其提供给无法访问应用程序任何其他部分的不同主机名(例如子域)。为此,您的 iframe src 必须指向不同的主机名;您无法在两个安全上下文之间编写脚本。
关于javascript - 使用 innerHTML 加载 iframe 有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1471318/