1

我正在为 Firefox OS 的主屏幕创建一个小部件。我已将小部件分离为 B2G 中的另一个应用程序,在主屏幕中,我将小部件的内容加载到 iframe 中。因为它来自不同的域,所以我修改了域,使它们相等,但是当我注册事件处理程序时,它仍然不起作用:

(widget 是 iframe 对象, foo 是我的函数。) widget.contentWindow.oncontextmenu = foo;

我的处理程序仍未响应“上下文菜单”事件而被调用。

但是,当我将小部件模块放在主屏幕模块中并让它们成为一个网络应用程序时,它可以正常工作。

4

1 回答 1

3

contentWindow 不可跨域访问。不同的应用程序有不同的来源。

如果您将 mozbrowser iframe 添加到主屏幕应用程序,则可以从该 iframe 中的 URL 加载小部件并侦听 iframe 上的 mozbrowsercontextmenu 事件。

<iframe id="widget" mozbrowser=true></iframe>

var widget = document.getElementById('widget');
widget.addEventListener('mozbrowsercontextmenu', eventHandler);

有关如何处理 contextmenu 事件的示例,请参阅浏览器应用程序https://github.com/mozilla-b2g/gaia/blob/master/apps/browser/js/browser.js#L1021

这需要向主屏幕应用程序添加“浏览器”权限。

如果您想将其作为应用程序加载,那么您也需要 iframe 上的 mozapp 属性,并且需要指向应用程序的清单。这就是系统应用程序中的窗口管理器将应用程序嵌入 iframe 的方式。

于 2012-11-13T13:58:19.857 回答