如何向窗口

时间:2016-10-11 02:29:57

标签: javascript xul thunderbird-addon

在我的插件中,我有一个菜单命令,可以打开我的插件的xul选项面板。那个xul窗口没有自己的javascript。

但是,由于主脚本打开了面板,主脚本如何知道用户在该窗口中单击“确定”并且数据已提交?我想知道提交事件何时触发,以便我可以检查在“选项”窗口中设置的首选项。

基本上,我想在提交窗口时运行一个函数,但我想从主要的插件脚本中做所有事情。

这就是我现在所拥有的。

function OpenPrefsPanel(){
    var prefpanel = window.openDialog("chrome://myaddon/content/options.xul", "", "centerscreen,chrome,modal");
    prefpanel.addEventListener("submit", function(e){  doSomething(); },false );
},

1 个答案:

答案 0 :(得分:0)

目前,您的活动永远不会开始,因为您将'modal'windowFeatures string一起传递。这使得执行window.openDialog()模态和阻塞(同步)。因此,window.openDialog()之后的第一行只会在用户点击“确定”或“取消”后执行。因此,在窗口已关闭/关闭后执行prefpanel.addEventListener()MDN documentation says

  

openDialog()的调用立即返回。如果要在用户关闭对话框之前阻止调用,请将模态作为windowFeatures参数提供。请注意,这也意味着用户在关闭模式对话框之前将无法与开启窗口进行交互。

您可以选择更改打开对话框的方式,使其不是模态的:

var prefpanel = window.openDialog("chrome://myaddon/content/options.xul", ""
                                  , "centerscreen,chrome");

在这种情况下,您可以使用以下内容获取unloaddialogacceptdialogcancel个事件(在Firefox 51.0a2中测试):

var prefpanel = window.openDialog("chrome://myaddon/content/options.xul", ""
                                  , "centerscreen,chrome");
prefpanel.addEventListener('load',optionsLoaded,true);
function optionsLoaded(){
    console.log('Options Window Loaded');
    //unload also fires prior to the load event, so add listener here in load handler:
    prefpanel.addEventListener('unload',optionsUnload,true);
    prefpanel.addEventListener('dialogaccept',dialogAccept,true);
    prefpanel.addEventListener('dialogcancel',dialogCancel,true);
}
function optionsUnload(){
    console.log('Options Window UNLOAD');
}
function dialogAccept(){
    console.log('Options Window dialogAccept');
}
function dialogCancel(){
    console.log('Options Window dialogCancel');
}

注意:至少在Firefox中,通常使用以下windowFeatures'chrome,titlebar,toolbar,centerscreen,modal'打开选项对话框。

但是,鉴于可以从加载项管理器打开选项对话框,您可能应该实现一些其他方法,以便通知您选项已更改。这可能是preference observer,或者 options.xul 中包含少量JavaScript。例如,<prefwindow>元素具有attributes,可用于添加在用户点击“确定”(ondialogaccept)或“取消”时执行的代码({{3}只需对 options.xul 文件进行微小更改即可完成这些属性。虽然使用addEventListener()通常更可取,但使用属性是合理的选择。< / p>