Der altbekannte Bug, kein @-Zeichen eingeben zu können, wenn der wmode auf transparent steht, sollte in Flash-Player 10.1 behoben sein. Ist er nicht. Zumindest nicht in Chrome. Man nutze diesen Workaround:
Wenn wir auf Windows sind (denn nur hier tritt der Bug auf), erlaube das @-Zeichen nicht als regulären Input. Denn in einigen Browsern tritt der Bug nicht auf, und in diesen Browsern wollen wir keine doppelten @-Zeichen 😉 Außerdem verbieten wir q und Q, denn leider leider kann man auf dem KeyboardEvent kein preventDefault() aufrufen. Wir hätten dann “@q”, bzw “@Q”, statt nur “@”.
|
if( Capabilities.os.toLowerCase().indexOf('windows') != -1 ) { _tf.restrict = "^[@qQ]"; _tf.addEventListener( KeyboardEvent.KEY_DOWN, _onWindowsKeyDown ); } |
Stattdessen prüfen wir jedes eingegebene Zeichen mit dem folgenden Listener auf @/q/Q (KeyCode 81 – unter OS X ist der Code ein anderer). Hier ist zu beachten, dass der Cursor nicht am Ende des Textes stehen muss! Und nicht nur das: Es kann auch Text markiert sein, wenn man das @-Zeichen eingibt. Deshalb die etwas aufwendige Bestimmung des Bereiches, der durch @ ersetzt werden muss. Zum Schluss setzten wir den Cursor hinter das frisch eingegebene Zeichen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
private function _onWindowsKeyDown( event:KeyboardEvent ):void { if( event.keyCode == 81 ) { var caret1 : int = _tf.selectionBeginIndex; var caret2:int = _tf.selectionEndIndex; var text1 : String = _tf.text.substring( 0, Math.min(caret1, caret2) ); var text2 : String = _tf.text.substring( Math.max(caret1, caret2), _tf.text.length ); _tf.text = text1; if( event.altKey ) { _tf.text += '@'; } else if( event.shiftKey ) { _tf.text += 'Q'; } else { _tf.text += 'q'; } _tf.text += text2; _tf.setSelection( text1.length+1, text1.length+1 ); } } |
Was mich jetzt noch interessieren würde: In dem Ticket ist die Rede von “ALTGR+2” statt “ALTGR+q”; der Autor des Tickets ist Norweger. Damit wird der obige Code nicht funktionieren, denn KeyCode 81 ist das “q” 🙁 Alternativ habe ich die Prüfung
|
if( String.fromCharCode(event.charCode)=='@' ) |
probiert. Das liefert mir auf OS X das erwünschte Ergebnis (“@”), aber auf Windows ist ALTGR+q das “q” und nicht “@”, ich gehe deshalb davon aus, dass ALTGR+2 die “2” ist 🙁 Gibt es keine international gültige Version, nur mittels KeyboardEvent auf die Eingabe von Sonderzeichen zu prüfen??