在我的插件中,我有一个菜单命令,可以打开我的插件的xul选项面板。那个xul窗口没有自己的javascript。
但是,由于主脚本打开了面板,主脚本如何知道用户在该窗口中单击“确定”并且数据已提交?我想知道提交事件何时触发,以便我可以检查在“选项”窗口中设置的首选项。
基本上,我想在提交窗口时运行一个函数,但我想从主要的插件脚本中做所有事情。
这就是我现在所拥有的。
function OpenPrefsPanel(){
var prefpanel = window.openDialog("chrome://myaddon/content/options.xul", "", "centerscreen,chrome,modal");
prefpanel.addEventListener("submit", function(e){ doSomething(); },false );
},
答案 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");
在这种情况下,您可以使用以下内容获取unload
,dialogaccept
或dialogcancel
个事件(在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>