Как в настоящее время, ваши события никогда не срабатывает, потому что вы передаете '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()
, как правило, предпочтительнее, с использованием атрибутов может быть разумным выбором.
Я не думаю, что вы можете сделать это, если окно вы открываете не совпадает с доменом –
хорошо, оба окна из моего собственного аддона - означает ли это, что они являются одним и тем же доменом? – bgmCoder
Просто FYI: я не смотрел варианты Thunderbird, но в Firefox «функции», указанные для окон параметров: «chrome, titlebar, toolbar , centerscreen, модальный» '. – Makyen