2010-10-18 22 views
0

J'utilise Flash CS4. Tout fonctionne comme il se doit lorsque CS4 prévisualise le swf après l'avoir compilé. Cependant, après l'intégration de l'élément Flash dans une page Web, si l'élément textArea perd son focus dans le flash, l'UIscrollbar intégrée de la zone de texte se réinitialise tout en haut.ActionScript 3: maintien de la position UIscrollbar de textarea sur la perte de focus dans le flash intégré

Voici le kicker: si j'ajoute un écouteur d'événement FOCUS_OUT au textArea pour stocker la valeur actuelle de la barre de défilement, je trouve que la valeur de la barre de défilement a été réinitialisée avant même que l'événement FOCUS_OUT ne soit déclenché! WTF?

Je pense que cela se produit car la propriété htmlText de textArea est remplie dynamiquement. Adobe AIR a avancé des méthodes pour la transmission de HTML, mais pas simple AS3, oh non. C'est odieux. Ce qui peut être fait?

Répondre

0

Je n'aurais jamais pensé répondre à ma propre question, mais c'est ici. Il s'avère que la chose htmlText peut avoir été un canard. La gigue de la barre de défilement se produit entre la fenêtre de contenu générée dynamiquement et son focus perdant, donc cela capture la position actuelle et si la barre de défilement est en bas sur l'événement click et transmet cette information à l'événement focus. displayWindow est celui avec le contenu généré dynamiquement.

Je suis relativement nouveau à AS3, alors laissez-moi savoir si tout cela n'est pas casher.

displayWindow.addEventListener(MouseEvent.ROLL_OUT, handleClick); 
function handleClick(event:MouseEvent):void 
{ 
    //here, user has clicked output window 
    var currentPosition = displayWindow.verticalScrollPosition; 
    var atTheBottom:Boolean = (currentPosition == displayWindow.maxVerticalScrollPosition); 
    var focusAdded:Boolean = false; 
    displayWindow.addEventListener(FocusEvent.FOCUS_OUT, 
    function handy() { 
     //here, user has clicked away from output window 

     if (!focusAdded) { 
      if (atTheBottom) 
       displayWindow.verticalScrollPosition = displayWindow.maxVerticalScrollPosition; 
      else 
       displayWindow.verticalScrollPosition = currentPosition; 

      focusAdded = true; 

     } else { 
      displayWindow.removeEventListener(FocusEvent.FOCUS_OUT, handy); 
      focusAdded = false; 
     } 
    } 
    ); 
}