4 ноября 2009 г.

Flash не сбрасывает фокус ввода (AS2)

Делая одну программу, столкнулся с интересной особенностью – в флеш-ролике есть несколько динамических текстовых полей. В них включена возможность выделения – чтобы можно было скопировать оттуда информацию.

Кроме того, в ролике есть много кнопок – которые можно нажимать НЕСКОЛЬКО РАЗ ПОДРЯД – каждое последующее нажатие выполняет полезную работу.

Так вот, если мы выделим в одном из динамических текстовых полей какой-то текст (ну и скопируем его в буфер обмена), а затем начнем нажимать кнопки, то выделение текста не снимается. Другими словами, при первом нажатии кнопки (уже после выделения) она выполняет нужную работу, а вот последующих нажатий уже не воспринимает.

Попытки исследовать все это безобразие привели вот к чему.

При выделении текста динамическое текстовое поле получает фокус ввода. А при нажатии кнопки оно отдает его кнопке только на время, а после нажатия фокус ввода снова возвращается к текстовому полю.

Исследования проводились с помощью обработчика события onSetFocus – вот код, взял прямо из книги Д. Гурского:


Так вот, попытки снять выделение программно, с помощью кода


, почему-то не подействовало.

Ситуация крайне странная – поскольку попробовав создать новый Flash-ролик, а в нем сделать пару динамических текстовых полей и кнопку – все заработало как надо. Причем при нажатии кнопки текстовое поле само потеряло фокус ввода, без всяких программных изысков - и больше фокус к нему не возвращался.

Но выход надо было найти, и он был найден.

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

Затем было указано, что этот клип может получить фокус программно, и что он не будет участвовать в клавиатурном обходе по нажатию Tab. Ну а после этого написана небольшая функция dropFocus () – которая переводит фокус на данный клип, а потом просто убирает с него фокус в никуда.

Вот весь код:


После чего вызов данной функции был вставлен в начало обработчиков событий кнопок. И все заработало как положено.

Хотя, в чем причина того, что текущий фокус ввода не сбрасывается самостоятельно – непонятна. А данный способ решения проблемы – ну, немного кривой :)

Впрочем, проблема решена, а это главное.

 

1 комментарий :

  1. Вроде должно сработать) Выглядит хорошо.
    Обязательно попробую, ибо я тоже с этим столкнулся. Уже все перепробовал - но похоже это уже ошибка самой среды разработки. Мне тоже приходилось раньше обходить в обход - разные программные недоразумения.

    ОтветитьУдалить