1

我的插件创建了一个Panel,它显示了当前为插件选择的首选项。
我想Panel用一个来填充button,谁的onclick()事件创建一个对话框,允许用户指定保存文件的目录。
这对于基于 XUL 的插件是可能的,但相同的代码在基于 sdk 的插件中不起作用,因为window无法访问.
有什么办法解决这个问题吗?

在插件代码中,我创建了Panel使用:

var confirmDialog = require("sdk/panel").Panel({
    width: 250,
    height: 250,
    contentURL: data.url("confirmDialog.html"),
});

confirmDialog.port.on("selectDir", function () {
    chromeManager.selectDir();
});

confirmDialog.html指定Panel的内容:

<div id="pathToFile"></div>
<button onclick="Panel.selectDir();">
</button>

confirmDialog.js向插件代码发送消息:

var Panel = {

    selectDir: function() {
        addon.port.emit("selectDir", '');
    }
};

chromeManager.js是插件代码的一部分,因此它可以访问 sdk API。

exports.selectDir = function() {

    var nsIFilePicker = Ci.nsIFilePicker, 
    fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);

    fp.init(window, nsIFilePicker.modeGetFolder);

    var ret = fp.show();

    if (ret == nsIFilePicker.returnOK || ret == nsIFilePicker.returnReplace) {
        document.getElementById('pathToFile').value = fp.file.path;
    }
}

但是我ReferenceError: window is not defined在运行此代码时得到,有什么方法window可以在这里访问或替代方法吗?

4

1 回答 1

1

window/utils特别是,您可以使用getMostRecentBrowserWindow()获取对活动窗口的引用,以便与nsIFilePickerAPI 一起使用。

于 2013-10-14T21:04:08.890 回答