Фикс за 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 = <![CDATA[
			     function( ){
			         return { ff: /Firefox[\/\s](\d+\.\d+)/.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

  1. Все още няма коментари.

  1. Все още няма нито един trackback.