Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > dimarik

Оценить эту запись

Фокус: удаленный из DL объект не теряет фокус.

Запись от dimarik размещена 16.01.2013 в 18:15
Обновил(-а) dimarik 16.01.2013 в 22:10

Может быть старая багофича.

Суть: ставим фокус (stage.focus = child) на дитё, внука или правнука и т.д. Удаляем родителя из дисплейлиста. Фокус остается прежним stage.focus == child // true.

Как использовать: кликаем на красный квадратик и жмем кнопочку "пробел". В текстовом поле появится имя удаленного из дисплейлиста дитя.

Как ожидается: удаление объекта, на котором есть фокус приводит к обнулению stage.focus.

Комментарий: удаление из дисплейлиста непосредственно объекта, ссылающегося в stage.focus приводит к обнулению stage.focus.

Тестировал FP 10.1 - 11.4 release

Код AS3:
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (C) 2013. Dimarik
//
///////////////////////////////////////////////////////////////////////////////
 
package
{
 
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import flash.display.Graphics;
import flash.display.InteractiveObject;
import flash.display.Sprite;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.text.TextField;
 
/**
 *  @author				Dimarik
 *  @version			1.0
 *  @langversion		3.0
 *  @playerversion		9.0
 * 
 */
[SWF(width="200", height="200", frameRate="12", backgroundColor="#E0EEEE")]
 
public class FocusTest extends Sprite
{
 
	public function FocusTest() {
		super();
 
		const s:Sprite = new Sprite();
		s.focusRect = false;
		s.mouseEnabled = false;
		s.addEventListener(KeyboardEvent.KEY_UP, this.handler_keyUp);
		s.name = 'foobar';
 
		const g:Graphics = s.graphics;
		g.beginFill(0xFF0000);
		g.drawRect(0, 0, 100, 100);
		g.endFill();
 
		const s1:Sprite = new Sprite();
		s1.addChild(s);
		super.addChild(s1);
		s1.y = 100;
 
		super.stage.addEventListener(MouseEvent.CLICK, this.handler_mouse);
 
		super.addChild(this._t);
	}
 
	private const _t:TextField = new TextField();
 
 
	private function handler_keyUp(event:KeyboardEvent):void {
		this._t.text = super.stage.focus.name; // Bingo!
	}
 
	private function handler_mouse(event:MouseEvent):void {
		const s:Sprite = event.target as Sprite;
		if ( s && s.parent === this ) {
			super.stage.removeEventListener(MouseEvent.CLICK, this.handler_mouse);
			super.stage.focus = s.getChildAt(0) as InteractiveObject;
			super.removeChild(s);
		}
	}
 
}
}
FocusTest.swf   (1.0 Кб)
Вложения
Тип файла: swf FocusTest.swf (997 байт, 407 просмотров)
Всего комментариев 9

Комментарии

Старый 16.01.2013 20:31 iNils вне форума
iNils
 
Аватар для iNils
Даешь живой пример в блоге!
Старый 16.01.2013 21:03 dimarik вне форума
dimarik
 
Аватар для dimarik
Аха, спасибо. Залил.
Старый 16.01.2013 21:48 alatar вне форума
alatar
 
Аватар для alatar
Это скорее фича, чем баг. Можно использовать на скрытом TextField для отлова символа нажатой клавиши.
Старый 16.01.2013 22:01 dimarik вне форума
dimarik
 
Аватар для dimarik
Имеешь ввиду, на удаленном из дисплейлиста TextField?
Старый 16.01.2013 23:29 alatar вне форума
alatar
 
Аватар для alatar
Да, хотя я не пробовал.
Старый 17.01.2013 11:39 expl вне форума
expl
Давняя фишка, один из вариантов затыкания:
Код AS3:
stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
...
 
private function onEnterFrame(event:Event):void
{
	// Боремся с постоянно пропадающим фокусом
	if (stage.focus == null || _stage.focus.stage == null)
	{
		stage.focus = stage;
	}
}
Старый 17.01.2013 11:58 etc вне форума
etc
 
Аватар для etc
Ну вот ещё слушать всякие REMOVED_FROM_STAGE
Старый 18.01.2013 00:32 Babylon вне форума
Babylon
 
Аватар для Babylon
Возможно предполагается ручное переопределение.
Старый 18.01.2013 01:26 dimarik вне форума
dimarik
 
Аватар для dimarik
Эту уязвимость активно использовали наши пользователи. Используем флекс. Диалоговое окошко. Кликают в нем "ок". Окно уже убралось с экрана, а по клавише пробела можно продолжать кликать на "ок". Фокус после клика остался на кнопке. Его засеттил FocusManager. Тамошний UIComponent подписывает себя на KeyboardEvent, а Button-наследник по "пробелу" диспатчит MouseEvent.CLICK, эмулируя клик.
 

 


Часовой пояс GMT +4, время: 02:27.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.