Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Кнопка-модификатор значения - проблема в браузере. (http://www.flasher.ru/forum/showthread.php?t=168305)

searinox 19.09.2011 18:29

Кнопка-модификатор значения - проблема в браузере.
 
Всем привет.
Есть задача:
Написать кнопку которая модифицирует значение в текстовом поле при: обычном клике, при зажимании кнопки мыши. В плеш флеере работает прекрасно.

У меня следующая проблема:
Когда флешка имбедится в браузер, если вместо обычного клика сделать двойной клик, то происходит эффект "залипания" и все происходит так, будто кнопка зажата.

Код AS3:

count_up_bt.addEventListener(MouseEvent.MOUSE_DOWN, countButtonMouseDown);
 
private function countButtonMouseDown(e:MouseEvent): void {
                                  trace("countButtonMouseDown");
                        ModifyCountNumber(e);
                        //Remove old listeners
                        e.currentTarget.removeEventListener(MouseEvent.MOUSE_DOWN, countButtonMouseDown);
                        //Add new listeners
                        e.currentTarget.addEventListener(MouseEvent.MOUSE_OUT, countButtonMouseUp);
                        e.currentTarget.addEventListener(MouseEvent.MOUSE_UP, countButtonMouseUp);                       
                        e.currentTarget.addEventListener(Event.ENTER_FRAME, countButtonEnterFrame);
 
                }
 
private function countButtonMouseUp(e:MouseEvent): void {
                                  trace("countButtonMouseUp");
                        //Remove old listeners and reset couter;
                        e.currentTarget.removeEventListener(MouseEvent.MOUSE_OUT, countButtonMouseUp);
                        e.currentTarget.removeEventListener(MouseEvent.MOUSE_UP, countButtonMouseUp);                       
                        e.currentTarget.removeEventListener(Event.ENTER_FRAME, countButtonEnterFrame);
                                  trace("Removed EnterFrameEvent")
                        enterFrameCounter = 0;
                        //Add new listeners
                        e.currentTarget.addEventListener(MouseEvent.MOUSE_DOWN, countButtonMouseDown);                       
                }
 
var enterFrameCounter:uint = 0;
 
                private function countButtonEnterFrame(e:Event):void {
                        //if counter uninitialized then initialize.
                        if (enterFrameCounter == 0) {
                                enterFrameCounter = 1;
                        }
 
                        if (enterFrameCounter == 6 || enterFrameCounter == 12 || enterFrameCounter == 18 || enterFrameCounter == 24) {
                                ModifyCountNumber(e);
                                enterFrameCounter++;
                        } else if (enterFrameCounter == 25){
                                enterFrameCounter = 1;
                        } else {
                                enterFrameCounter++;
                        }
                }
 
ModifyCountNumber(e:Event):void {
Значение в некотором текстовом поле модицифируется на какое-то значение однажды
}


Пример трейса при 2 кликах сделанных не чаще чем через 1 сек.:

Removed EnterFrameEvent
countButtonMouseUp
countButtonMouseDown
Removed EnterFrameEvent
countButtonMouseUp
countButtonMouseDown

Пример трейса при 2 кликах сделанных не реже чем через 0.5 сек.:

countButtonMouseDown
Removed EnterFrameEvent
countButtonMouseUp
countButtonMouseDown
Removed EnterFrameEvent
countButtonMouseUp
countButtonMouseDown

(да, да в этом случае от куда-то генерируется 3 клика)

Вопрос: как избавится от этого бага?

GBee 19.09.2011 18:35

Имеет смысл использовать таймер и некоторое пороговое значение для зажатия.

Цитата:

Код AS3:

private function countButtonEnterFrame(e:Event):void {
                        //if counter uninitialized then initialize.
                        if (enterFrameCounter == 0) {
                                enterFrameCounter = 1;
                        }
 
                        if (enterFrameCounter == 6 || enterFrameCounter == 12 || enterFrameCounter == 18 || enterFrameCounter == 24) {
                                ModifyCountNumber(e);
                                enterFrameCounter++;
                        } else if (enterFrameCounter == 25){
                                enterFrameCounter = 1;
                        } else {
                                enterFrameCounter++;
                        }
                }


Это вообще ад.

searinox 19.09.2011 18:51

1. проблема не в этой функции, а в том что фрейм листенер не удаляется так как генерится новый кликовый ивент после 2 клика(в серии 2 быстрых клика).
2. Что тебе не нравится в моей функции? помоему она весьма элегантна, ну не считая метода реализации частоты инкрементирования.
З.Ы. Я модифицирую 1 массаг и покажу тривиальный трейс.
З.З.Ы. Еще раз напоминаю что в флеш плеере все работает прекрасно, проблемы начинаются при интеграции флеша в браузер и открытии страницы с ним с сервера.

Добавлено через 4 часа 10 минут
Возможно можно было бы сдлеать костыль если получать в этом фрейм ивенте инфу о том, нажата ли кнопка в данный момент или нет. Это если нету никаких более элегантных решений...

Добавлено через 18 часов 44 минуты
Ни у кого нету вариантов? Я уже замаялся с этой проблемой копатся, может у кого какието мысли возникли- поджелитесь, буду очень благодарен.
Также могу аметить что всего таких кнопок 6. К каждой из них крепится обработчик событий как в самой 1 строчке, дальше он с ними работает как с таргетами. Это может быть проблемой?


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

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