2010-12-09 62 views
3

J'essaie d'empêcher une clé de modifier le texte d'une TextArea Flex. Je ne veux pas définir la propriété editable sur false, car je souhaite que le signe insertion soit visible pour un indicateur de position actuelle, afin que l'utilisateur sache d'où partira la recherche qu'il lance.Flex 3: désactivation du retour arrière et suppression dans une TextArea

J'ai ajouté des gestionnaires d'événements pour change et textInput, ainsi que keyUp et keyDown qui font un 'event.preventDefault' ainsi qu'un 'event.stopImmediatePropagation'. Cela fonctionne très bien pour la plupart des clés, à l'exception du retour arrière et de la suppression.

Y a-t-il un moyen de les empêcher de faire quoi que ce soit? Pourquoi ne pas simplement réinsérer le texte lors d'un changement?

+0

Dans vos écouteurs d'événement où vous empêchezDefault et stopPropagation utilisez-vous la phase de capture? –

Répondre

1

Hmmm, semble comme ça ne fonctionne vraiment pas dans le navigateur, que diriez-vous d'une solution de contournement, pas sûr si vous le souhaitez, mais semble réaliser ce que vous avez besoin en dehors de coller:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:Script> 
     <![CDATA[ 
      import mx.controls.Alert; 

      private var _lastSelStart:Number = 0; 
      private var _lastSelEnd:Number = 0; 
      private var _lastText:String = null; 
      private var _prevent:Boolean = false; 

     private function onKeyDown(event:KeyboardEvent):void { 
      if (event.keyCode == 8 || event.keyCode == 46) { 
       if (!_prevent) { 
        _prevent = true; 
        _lastText = txt.text; 
        _lastSelStart = txt.selectionBeginIndex; 
        _lastSelEnd = txt.selectionEndIndex; 
       } 
      } 
     } 

     private function onKeyUp(event:KeyboardEvent):void { 
      if (_prevent) { 
       _prevent = false; 
       txt.text = _lastText; 
       _lastText = null; 
       callLater(txt.setSelection, [_lastSelStart, _lastSelEnd]); 
      } 
     } 

     ]]> 
    </mx:Script> 
    <mx:TextArea keyDown="onKeyDown(event);" keyUp="onKeyUp(event);" width="100%" height="100%" 
     id="txt" /> 
</mx:Application> 
+0

Merci beaucoup pour votre aide - très appréciée. Je pense que je vais aussi avoir besoin d'une certaine logique pour gérer les touches enfoncées, mais cela semble bon. Dommage d'avoir à faire une copie de la chaîne bien - il pourrait aller bang! – Nic

+0

J'ai modifié le code pour gérer les touches maintenues enfoncées. Aussi, si cela vous aide, pouvez-vous le marquer comme réponse? – radekg

1

+0

Hmm - idée intéressante, mais au moment où l'événement de changement est déclenché, le champ de texte a déjà changé, ce qui implique que je devrais garder une deuxième copie du texte. Je vais avoir affaire à des cordes assez grandes, donc je préférerais ne pas le faire. En outre, les index de début et de fin de la sélection sont égaux à ce stade, donc si l'utilisateur a sélectionné un bloc de texte, il ne semble pas y avoir de moyen de déterminer ce qu'il a vraiment changé. Ou pouvez-vous obtenir cela de l'événement quelque part? – Nic

+0

@Mike Vous n'avez pas besoin de conserver une deuxième copie du texte si vous liez le champ de texte à une variable qui contient le texte. Ensuite, pour changer le texte, changez la variable. et dans l'écouteur clé du champ de texte réinitialisé à la valeur de votre var. Je n'ai pas testé cela mais ça sonne juste dans ma tête. –

2

Cela peut aider:

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:Script> 
     <![CDATA[ 
      private function onKeyDown(event:KeyboardEvent):void { 
       if (event.keyCode == 8 || event.keyCode == 46) { 
        event.preventDefault(); 
       } 
      } 
    ]]> 
    </mx:Script> 
    <mx:TextArea keyDown="onKeyDown(event);" width="100%" height="100%" /> 
</mx:WindowedApplication> 
+0

Malheureusement, ce n'est pas le cas! J'ai essayé quelque chose de similaire, et bien que le gestionnaire d'évènement soit appelé, le texte est toujours effacé, et je ne sais pas pourquoi ... – Nic

+0

J'ai testé ça et ça fonctionne parfaitement. –

+0

Ok, j'ai testé comme une application de bureau et fonctionne, mais comme une application Web ne fonctionne pas. –

0

Je pense que je l'ai trouvé un moyen: en flash du preventDefault ne fonctionnent pas pour l'événement clé, mais ils fonctionnent bien pour événement qui change. Vous pouvez faire quelque chose de similaire à ce https://stackoverflow.com/a/8078910/1927950 pour éviter toute modification, mais gardez le curseur.