2016-10-11 3 views
0

Dans mon addon, j'ai une commande de menu qui ouvre le panneau Options de xul pour mon addon. Cette fenêtre xul n'a pas son propre javascript.Comment ajouter un écouteur d'événement à la fenêtre

Cependant, puisque le script principal ouvre le panneau, comment le script principal peut-il savoir quand l'utilisateur clique sur OK dans cette fenêtre et que les données sont soumises? Je veux savoir quand l'événement de soumission se déclenche afin que je puisse vérifier les préférences qui ont été définies dans la fenêtre Options.

Fondamentalement, je veux courir une fonction quand la fenêtre est soumise, mais je veux faire tout du manuscrit principal d'addon.

Voici ce que j'ai en ce moment.

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

Je ne pense pas que vous pouvez le faire que si la fenêtre que vous ouvrez est pas le même domaine –

+0

bien, Les deux fenêtres proviennent de mon propre addon - cela signifie-t-il qu'elles sont du même domaine? – bgmCoder

+0

Juste FYI: Je n'ai pas regardé les options pour Thunderbird, mais dans Firefox les 'features' spécifiées pour les fenêtres d'options sont:' 'chrome, barre de titre, barre d'outils , centercreen, modal ' '. – Makyen

Répondre

0

Comme il est actuellement, vos événements parce que le feu ne vous passez 'modal' avec le windowFeatures string. Ceci rend l'exécution de window.openDialog() modale et bloquante (synchrone). Ainsi, la première ligne après votre window.openDialog() ne s'exécutera qu'après que l'utilisateur a cliqué sur "OK" ou "Annuler". Par conséquent, votre prefpanel.addEventListener() est exécuté après la fermeture/fermeture de la fenêtre. Le MDN documentation says:

L'appel à openDialog() revient immédiatement. Si vous souhaitez bloquer l'appel jusqu'à ce que l'utilisateur ait fermé la boîte de dialogue, indiquez modal comme paramètre windowFeatures. Notez que cela signifie également que l'utilisateur ne pourra pas interagir avec la fenêtre d'ouverture tant qu'il n'aura pas fermé la boîte de dialogue modale.

Vous pouvez choisir de changer la façon dont vous ouvrez la boîte de dialogue de sorte qu'il est pas modal:

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

Dans ce cas, vous pouvez utiliser ce qui suit pour obtenir l'une des unload, dialogaccept ou dialogcancel événements (testé dans 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'); 
} 

note: au moins dans Firefox, les boîtes de dialogue d'options sont normalement ouvertes avec les éléments suivants windowFeatures: 'chrome,titlebar,toolbar,centerscreen,modal'. Toutefois, étant donné que votre boîte de dialogue d'options peut être ouverte à partir du Gestionnaire de modules complémentaires, vous devez probablement implémenter une méthode supplémentaire pour vous avertir que vos options ont été modifiées. Cela peut être un preference observer, ou avoir une petite quantité de JavaScript inclus avec vos options .xul. Par exemple, l'élément <prefwindow> a attributes qui peut être utilisé pour ajouter du code qui est exécuté lorsque l'utilisateur clique sur "OK" (ondialogaccept) ou sur "Annuler" (ondialogcancel), ce qui peut être fait avec des modifications mineures de votre options.xul fichier. Tout en utilisant addEventListener() est généralement préférable, en utilisant les attributs est peut être un choix raisonnable.