【问题标题】:xpcom array can transfer in different xul files?xpcom数组可以在不同的xul文件中传输吗?
【发布时间】:2010-06-06 06:35:33
【问题描述】:

现在我正在开发一个 firefox 扩展,我可以在一个带有 main xul 的 js 中定义一个全局数组吗?我发现当我用另一个xul在另一个js中使用它时,它不能工作,所以我搜索了Firefox开发的文档。我发现无法在具有不同 xul 文件的两个 js 文件之间传输一个公共数组。然后我在一个js中定义了一个xpcom mutablearray:

var eleList = Components.classes["@mozilla.org/array;1"] .createInstance(Components.interfaces.nsIMutableArray);

但是当我想在另一个 js 中使用它时:它仍然不起作用,为什么?非常感谢!

【问题讨论】:

    标签: javascript firefox firefox-addon xul


    【解决方案1】:

    问题在于,即使您创建了可变数组,您也在将对该数组对象的引用存储在创建它的 XUL 上下文中的变量中。在另一个 XUL 中,您看不到该变量,因此您无法访问该数组。

    有几种解决方案可以在不同的上下文中访问对象:

    • 从其中一个上下文中,获取对另一个上下文的引用。例如,您在主窗口中定义了一个变量(browser.xul 覆盖),您可以通过使用窗口管理器从侧边栏中获取它以获取对主窗口的引用。

    • 您可以创建自己的 XPCOM 对象,虽然这并不简单,特别是对于像您这样的简单情况

    • 您可以使用 JavaScript 模块来创建全局单例。

    您应该考虑查看 JavaScript 模块选项。这是最简单、最可靠的方法。它是在 Firefox 3.0 中引入的,您可以只使用 JavaScript 来完成,而无需创建 XPCOM

    点击这里了解更多详情:

    https://developer.mozilla.org/en/JavaScript_code_modules/Using_JavaScript_code_modules

    更新:

    以下是有关如何获取对主窗口的引用以查看 browser.xul 中定义的变量的更多详细信息。

    您在 browser.xul 叠加层(主窗口)中定义变量:

    myArray = [1, 2, 3];
    

    然后从侧边栏 xul,您可以获得对主窗口的引用并使用该引用访问您的变量:

    var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                        .getInterface(Components.interfaces.nsIWebNavigation)
                        .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
                        .rootTreeItem
                        .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                        .getInterface(Components.interfaces.nsIDOMWindow);
    
    var value = mainWindow.myArray[0];
    

    这些链接可能对您有用:

    https://developer.mozilla.org/en/Working_with_windows_in_chrome_code

    https://developer.mozilla.org/en/Code_snippets/Tabbed_browser

    【讨论】:

    • 首先非常感谢您!正如您所说:“您在主窗口(browser.xul 覆盖)中定义了一个变量,您可以使用窗口管理器从侧边栏中获取它以获取对主窗口的引用。”我不是很清楚。我的情况和你说的一样:我在主窗口(浏览器 xul 覆盖)的 js 中得到了一组观察 swf 文件路径,我想从侧边栏 js 中获取它们,所以我想在浏览器中定义一个变量.xul?以及如何做,如何从侧边栏 js 中获取它?再次感谢您。
    • 刚刚在响应中添加了更多信息。希望对您有所帮助!
    • 谢谢你的帮助,我想这些代码可能会添加到xul的js中,因为我的js代码很长?
    • 嗨@jin,我不确定我是否理解你的最后一个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 2018-10-29
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    相关资源
    最近更新 更多