2016-10-11 3 views
0

В моем приложении у меня есть команда меню, которая открывает панель Xul Options для моего аддона. Это окно 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: я не смотрел варианты Thunderbird, но в Firefox «функции», указанные для окон параметров: «chrome, titlebar, toolbar , centerscreen, модальный» '. – 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"); 

В этом случае, вы можете использовать следующее, чтобы получить какой-либо из 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 или иметь небольшое количество JavaScript, включенных в ваши options.xul. Например, элемент <prefwindow> имеет attributes, который может быть использован для добавления кода, который выполняется при нажатии пользователем «ОК» (ondialogaccept) или «Отмена» (ondialogcancel). Выполнение этих атрибутов может быть выполнено только с незначительными изменениями в вашем options.xul файл. при использовании addEventListener(), как правило, предпочтительнее, с использованием атрибутов может быть разумным выбором.

Смежные вопросы