2017-06-14 2 views
0

Considérez ce qui suit après script Effets:Après gestionnaire d'événements Effets se termine à la mi-exécution

var window = new Window('dialog'); 
var edit1 = window.add('EditText { characters: 20, active: true }'); 
var edit2 = window.add('EditText { characters: 20 }'); 
edit1.onChange = edit2.onChange = function() { 
    for (var i = 1; i <= 100; i++) { 
     $.writeln(i); 
    } 
} 
window.show(); 

correctement les œuvres suivantes: Le script crée une boîte de dialogue modale avec deux champs de saisie de texte. Chaque fois que je modifie le texte dans l'un des champs, puis le laisser (via l'onglet), le gestionnaire onChange est exécuté et imprime les numéros 1..100 à la console. Notez que onChange n'est levé que lorsqu'un champ de texte modifié perd son focus, et non immédiatement après chaque coup de clé.

Voici le problème: Si je modifie l'un des champs de texte, appuyez immédiatement sur la touche Échap, la boîte de dialogue se ferme. Lors de la fermeture, le champ de texte perd le focus, ainsi son gestionnaire onChange est exécuté. Cependant, son exécution se termine après quelques instructions. Il parvient généralement à imprimer les nombres 1..7 ou 1..10, puis s'arrête juste et le débogueur me dit que l'exécution du script est terminée. Je suppose qu'il s'agit d'une sorte de problème de récupération de place: une fois que la fenêtre disparaît, elle obtient GC'd, avec ses gestionnaires d'événements en cours d'exécution. Comment puis-je empêcher After Effects de terminer silencieusement mon gestionnaire d'événements?

+0

J'ai trouvé une solution de contournement: En vous inscrivant à OnChanging plutôt que onChange, j'averti immédiatement pour chaque touche, donc au moment où l'utilisateur presse Esc pour fermer la fenêtre, il n'y a plus rien à faire. Pas ma solution préférée, mais ça marche pour moi. –

Répondre

0

Pour contourner ce problème, vous pouvez définir l'événement OnClose comme suit:

function fnc(){ 
    for (var i = 1; i <= 100; i++) { 
     $.writeln(i); 
    } 
} 
edit1.onChange = edit2.onChange = function(){ 
    fnc(); 
} 

window.onClose = function(){ 
    edit1.onChange = edit2.onChange = null; 
    fnc(); 
} 
+0

C'est une idée géniale, mais ça ne marche pas pour moi. Lorsque je ferme la fenêtre en appuyant sur la touche Echap, le gestionnaire onClose de la fenêtre se termine prématurément également. Donc, le résultat est le même. –