Фикс за wmode бъга на флаш плейъра под FireFox
Бях писал за фикснатият wmode бъг в новата версия на флаш плейъра под FireFox, но сега вече направих почти цялостен фикс за проблема. Самият проблем се появява, когато се използва клавишната комбинация shift+стрелки за селекция на текст в текстово поле. И така, това което направих беше да пренапиша TextInput класа и да го използвам него вместо оригиналния. Имплементацията може би изглежда странна, но работи! Въпреки, че не е цялостно решение, аз си изгубих бая време да си поиграя с този алгоритъм и така и не успях да го подкарам да работи изцяло както се очаква. Ако някой иска да вложи също малко време в това ето го и кода:
package { import mx.controls.TextInput; import mx.events.FlexEvent; import flash.events.KeyboardEvent; import flash.events.Event; import flash.ui.Keyboard; import flash.external.ExternalInterface; public class CafeTextInput extends TextInput { private var ssi : int = 0; private var sei : int = 0; private var shiftDirection : String = 'none'; private var lastShiftDirection : String = 'none'; public function CafeTextInput() { super(); var method:XML = </.test(navigator.userAgent), version:navigator.appVersion};} ]]> var o:Object = ExternalInterface.call( method ); if(o.ff) { this.addEventListener(KeyboardEvent.KEY_DOWN, onBeforeKeyDown, false, 10000); this.addEventListener(KeyboardEvent.KEY_DOWN, onAfterKeyDown, false, -10000); } } private function onBeforeKeyDown(e : KeyboardEvent) : void { if (e.keyCode == Keyboard.LEFT || e.keyCode == Keyboard.RIGHT) { if(ssi == -11111111 && sei == -11111111) { ssi = this.selectionBeginIndex; sei = this.selectionEndIndex; } } } private function onAfterKeyDown(e : KeyboardEvent) : void { if (e.keyCode == Keyboard.LEFT || e.keyCode == Keyboard.RIGHT) { if(ssi != -11111111 && sei != -11111111) { if(e.shiftKey) { if(sei == ssi) { shiftDirection = 'none'; } if(e.keyCode == Keyboard.LEFT) { if(shiftDirection == 'right' && lastShiftDirection != 'right') { sei--; } if(shiftDirection == 'none' && ssi+1 == sei) { shiftDirection = 'left'; } this.setSelection(sei, ssi); lastShiftDirection = 'left'; } else if(e.keyCode == Keyboard.RIGHT) { if(shiftDirection == 'left' && lastShiftDirection != 'left') { ssi++; } if(shiftDirection == 'none' && ssi+1 == sei) { shiftDirection = 'right'; } this.setSelection(ssi, sei); lastShiftDirection = 'right'; } } else { shiftDirection = 'none'; this.setSelection(ssi, sei); } ssi = -11111111; sei = -11111111; } } } } }
Прочети статията на: English
Все още няма коментари.