2016-10-11 95 views
0

在我的插件中,我有一個菜單命令可以打開我的插件的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

好,這兩個窗口都來自我自己的插件 - 這是否意味着它們是相同的域名? – bgmCoder

+0

只是FYI:我沒有看過雷鳥的選項,但在Firefox中,爲選項窗口指定的「features」是; chrome,titlebar,toolbar ,中心屏幕,模態」 '。 – Makyen

回答

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"); 

在這種情況下,你可以使用下面的方法得到任何的unloaddialogaccept,或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)或「取消」(ondialogcancel)時執行的代碼。對這些屬性的操作只需稍做更改即可完成options.xul文件。在使用addEventListener()通常是優選的,使用的屬性是可以通過合理的選擇。

相關問題