AS3: Фокус TextField - PullRequest
       38

AS3: Фокус TextField

2 голосов
/ 10 июля 2009

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

txtTextField.addEventListener(FocusEvent.FOCUS_IN, handleFocusIn);
function handleFocusIn() {
 //select all text here
}

Ответы [ 7 ]

5 голосов
/ 09 февраля 2010

Мне нужно было то же самое, чтобы выбрать содержимое текстового поля, когда оно получает фокус.

Я пытался:

A) Просто выберите после FocusEvent. Кажется, это не работает (я предполагаю, что FocusEvents срабатывают до обработки щелчка мыши, что, в свою очередь, отменяет выбор).

B) Выбор на каждый клик мыши. Это работает, но это очень раздражает пользователя, который хочет выделить только часть текста позже, так как эта попытка всегда приводит к -all- выбранному контенту.

Кажется, что работает следующий обходной путь:

    myTextField.addEventListener(MouseEvent.CLICK, selectAllOnce);

    function selectAllOnce(e:MouseEvent) {
        e.target.removeEventListener(MouseEvent.CLICK, selectAllOnce);
        e.target.addEventListener(FocusEvent.FOCUS_OUT, addSelectListener);
        selectAll(e);
    }

    function addSelectListener(e:FocusEvent) {
        e.target.addEventListener(MouseEvent.CLICK, selectAllOnce);
        e.target.removeEventListener(FocusEvent.FOCUS_OUT, addSelectListener);
    }

    function selectAll(e:Event) {
        e.target.setSelection(0, e.target.getLineLength(0));
    }

Надеюсь, это поможет. Лично я думаю, что было бы наиболее логичным, если бы Adobe просто добавила опцию для этого для объекта TextField.

4 голосов
/ 10 июля 2009

Ваш handleFocusIn должен иметь подпись

function handleFocusIn(event:FocusEvent) // or just Event
2 голосов
/ 26 февраля 2010

Я делаю свой обработчик вот так. Работает как шарм:

private function onFocusIn(e:FocusEvent):void 
{
    setTimeout(title.setSelection, 100, 0, e.target.text.length);           
}
2 голосов
/ 21 июля 2009

У меня была похожая проблема на этапе разработки прототипа (во Flash). Текстовое поле вообще не запускало события FocusEvent.FOCUS_OUT. Проблема была в том, что у меня был компонент Button на сцене. Как только я заменил этот экземпляр компонента Flash Button пользовательской кнопкой, созданной с нуля, я начал работать. Мне не удалось найти эту ошибку и решение по Интернету.

С компонентом Button на сцене я получаю событие FOCUS_IN только при первом нажатии на него. После этого я не получаю ни события FOCUS_OUT, ни события FOCUS_IN.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 11 апреля 2019

Вы просто забыли переменную, которая ловит событие. Это должно быть в скобках в определении функции. Самый короткий путь - просто назвать его «е» без дополнительных определений, как я это сделал здесь. Работает:

txtTextField.addEventListener(FocusEvent.FOCUS_IN, handleFocusIn);
function handleFocusIn(e) {
 //select all text here
}
0 голосов
/ 11 августа 2013

Простое решение:

import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.FocusEvent;

tf.addEventListener(FocusEvent.FOCUS_IN, handleFocusIn);

function handleFocusIn(e:FocusEvent):void
{
    tf.addEventListener(MouseEvent.MOUSE_UP, preventLosingSelection);
    tf.setSelection(0, tf.length);
    stage.focus = tf;
}

function preventLosingSelection(e:MouseEvent):void
{
    tf.removeEventListener(MouseEvent.MOUSE_UP, preventLosingSelection);
    tf.setSelection(0, tf.length);
    stage.focus = tf;
}

Надеюсь, это поможет кому-то в будущем!

0 голосов
/ 09 июля 2013

Вы можете обнаружить, что пользователь не выбирает только часть текста, подобную этой:

private function clickHandler(e:MouseEvent){
    if(tfield.selectionBeginIndex == tfield.selectionEndIndex){
        tfield.setSelection(0, tfield.length);
    }
}
...