为了使子级文档中的脚本能够访问父级沙箱桥,必须先设置沙箱桥,然后才能运行脚本。创建新页 DOM 之后,在分析任何脚本或添加 DOM 元素之前,Window、frame 和 iframe 对象将调度
dominitialize
事件。可以使用
dominitialize
事件按照适当的页面构造顺序尽早建立沙箱桥,以便页面中定义的所有脚本均能访问该沙箱桥。
以下示例说明如何创建父级沙箱桥,以响应从子级 frame 调度的
dominitialize
事件:
<html>
<head>
<script>
var bridgeInterface = {};
bridgeInterface.testProperty = "Bridge engaged";
function engageBridge(){
document.getElementById("sandbox").contentWindow.parentSandboxBridge = bridgeInterface;
}
</script>
</head>
<body>
<iframe id="sandbox"
src="http://www.example.com/air/child.html"
documentRoot="app:/"
sandboxRoot="http://www.example.com/air/"
ondominitialize="engageBridge()"/>
</body>
</html>
以下
child.html
文档说明子级内容如何访问父级沙箱桥:
<html>
<head>
<script>
document.write(window.parentSandboxBridge.testProperty);
</script>
</head>
<body></body>
</html>
若要侦听子级窗口(而非框架)上的
dominitialize
事件,必须将侦听器添加到通过
window.open()
函数创建的新子级 window 对象:
var childWindow = window.open();
childWindow.addEventListener("dominitialize", engageBridge());
childWindow.document.location = "http://www.example.com/air/child.html";
在这种情况下,无法将应用程序内容映射到非应用程序沙箱。只有在从应用程序目录外部加载
child.html
时,此方法才有用。仍可将窗口中的应用程序内容映射到非应用程序沙箱,但必须首先加载一个中间页,在中间页中使用框架来加载子级文档并将其映射到所需的沙箱。
如果使用 HTMLLoader 类的
createRootWindow()
函数来创建窗口,则新窗口不是从中调用
createRootWindow()
的文档的子级。因此,无法从调用窗口建立到加载到新窗口中的非应用程序内容的沙箱桥。而是必须在新窗口中加载一个中间页,在中间页中使用框架来加载子级文档。这样,就可以在新窗口的父级文档与加载到框架中的子级文档之间建立沙箱桥。