我的应用程序(正在开发中)使用Safari 4.0.3和JavaScript向用户展示其前端。后端是PHP和SQLite。这是在OS X 10.5.8下。
应用程序会不时收到大量的HTML呈现给用户。每个块都是收到的电子邮件的正文,因此无法控制所接收的HTML的质量。我做的是使用innerHTML将块推入iFrame并让Safari渲染它。
要做到这一点,我这样做:
window.frames["mainwindow"].window.frames["Frame1"].document.body.innerHTML = myvar;
其中myvar包含收到的HTML。现在,在大多数情况下,这可以按预期工作,并且HTML按预期呈现。例外情况似乎是块的标记:
<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的使用,或者对其讨论的指示,都会受到赞赏。
答案 0 :(得分:2)
innerHTML
与撰写完整文档不同。即使您按照Gumbo的建议写入outerHTML
,根元素之外的内容也会使其混淆,例如doctypes。要一次编写整个文档,您必须使用旧式跨框架document.write:
var d= window.frames["mainwindow"].window.frames["Frame1"].document;
d.open();
d.write(htmldoc);
d.close();
每个块都是收到的电子邮件的正文,因此无法控制所收到的HTML的质量。
好的,您可能遇到安全问题。
如果您让不受信任的来源(如电子邮件)将HTML注入您的安全上下文(以及您在安全上下文中写入 的iframe),它可以运行自己的JavaScript ,包括访问和控制整个封闭应用程序以及同一主机名上的任何其他内容的脚本。除非你的申请是如此微不足道,否则你不关心这一点,这真是个坏消息。
如果您需要允许不受信任的HTML,许多Webmail服务的工作方式是将其提供给不能访问应用程序任何其他部分的其他主机名(例如子域)。要做到这一点,你的iframe src必须指向不同的主机名;你无法在两个安全上下文之间编写脚本。