Több flashben készített applikációban is jelentkezik egy olyan probléma, ami megoldásért kiáltott, nevezetesen a @ jel használata beviteli mezőkben. Ez igazából a Chrome-ban jeletkezik, a Ctrl + Alt + V billentyűkombinációra nem csak a kukacot illeszti be a jószág, hanem a vágólapon található cuccot is. Ennek kiküszöbölésére találtam ki egy módszert, mert sehol nem találtam rá megoldást. Ez a megoldás csak magyar nyelvű Windows és billentyűzet kombónál működik, német nyelvű billentyűzetnél ugyanez a probléma a Ctrl + Alt + Q betűnél jelentkezik. Ezt nem szűri ki az én megoldásom.
Nézzük tehát:
package { import flash.events.Event; import flash.events.FocusEvent; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import flash.text.TextField; // első körben kiterjesztem az osztályomat a szabványos TextField osztállyal public class InputTextField extends TextField { private var firstPart:String; private var lastPart:String; private var car:int; private private var pressed:Boolean = false; public function InputTextField() { // a super() függvénnyel biztosítom azt, hogy az osztályom // constructor függvénye a TextField constructor függvényének //tulajdonságait megkapja super(); //hozzáadok egy MouseEvent.CLICK eseményt az osztályomhoz this.addEventListener(MouseEvent.CLICK, addFocusHandlers); } private function addFocusHandlers(e:MouseEvent):void { //a példányosított szövegmezőre kattintva a következő eseménykezelők //kerülnek: //leszedem a CLICK eseménykezelőt - ez majd a későbbiekben //visszakerül, ha elveszti a fókuszt a szövegmezőnk this.removeEventListener(MouseEvent.CLICK, addFocusHandlers); //a FocusEvent.FOCUS_OUT lekapja a billentyűzet eseménykezelőket //és saját magát majd visszateszi a CLICK eseménykezelőt this.addEventListener(FocusEvent.FOCUS_OUT, focusOutHandler2); //Ha fölengedünk egy gombot, akkor az alábbi eseménykezelő //hívódik meg: this.addEventListener(KeyboardEvent.KEY_DOWN, detectKey); //Ha lenyomunk egy gombot, akkor az alábbi eseménykezelő //hívódik meg: this.addEventListener(KeyboardEvent.KEY_UP, releaseKey); } private function focusOutHandler2(e:FocusEvent):void { this.removeEventListener(KeyboardEvent.KEY_DOWN, detectKey); this.removeEventListener(KeyboardEvent.KEY_UP, releaseKey); this.addEventListener(MouseEvent.CLICK, addFocusHandlers); this.removeEventListener(FocusEvent.FOCUS_OUT, focusOutHandler2); } //ha a billentyűzeten lenyomódik egy vagy több gomb, letesztelem, //hogy a pressed változó hamis értékű-e (Ez azért kell mert ez az //eseménykezelő egy billentyű lenyomásával nem egyszer hívódik meg, //hanem ismétlődik a rendszerbeállításoknak megfelelően), ha igen, //akkor tesztelem a ctrl + alt + v billentyűkombinációt. private function detectKey(e:KeyboardEvent):void { if (pressed == false) { if (e.ctrlKey && e.altKey && e.keyCode == 86) { //a car változó a kocsi pozícióját menti el (az a villogó vonal //ami azt a pontot jelöli ahová be lesz szúrva a következő betű) car = this.caretIndex; //firstPart változó a textmezőben esetlegesen már beírt szöveget fogja //tartalmazni a kocsi pozíciója előtt firstPart = this.text.substring(0, car); //lastPart változó a textmezőben esetlegesen már beírt szöveget fogja //tartalmazni a kocsi pozíciója után lastPart = this.text.substring(car, this.text.length); //hozzácsapunk még egy Event.CHANGE eseménykezelőt a TextField-ünkhöz, //ez azért kell, hogy detektáljuk, ha változik a szövegmező tartalma this.addEventListener(Event.CHANGE, changeTextField); //a pressed változó igaz értéket kap pressed = true; } } } private function changeTextField(e:Event):void { //Ha változik a szöveg tartalma, akkor beszúrjuk a kukacot a két //lementett szövegrészletünk közé this.text = firstPart + "@" + lastPart; //majd a kocsit a megfelelő helyre teszzük, ha még írna a szövegmezőbe //a júzer this.setSelection(car + 1, car + 1); } private function releaseKey(e:KeyboardEvent):void { //Ha felemeli az ujját a júzer a V betűről, akkor pressed változó ismét //false állapotba kerül, valamint leveszzük a szövegmezőben változást //értelmező eseménykezelőt if (e.keyCode == 86) { this.removeEventListener(Event.CHANGE, changeTextField); pressed = false; } } } }
Ha van kérdés, szívesen segítek. Esetleg ha tudtok jobb megoldást és az nem az angol billentyűzetre váltás és utána a shift + 2 akkor azt szívesen fogadom :)
További jó kódolást!