在 Air/Flex 中使用键盘时的下拉列表选择行为



假设我有一个包含 50 个状态的 DropDownList。我想输入字母"C + O + L"跳转到科罗拉多州,就像Firefox和大多数应用程序一样。

现在,它正在从加利福尼亚跳到俄亥俄州,以路易斯安那州结束......有人知道一个简单的方法吗?

多谢!

您可以尝试创建一个扩展 DropDownList 的自定义组件,并覆盖有问题的函数以添加所需的功能。 这是我能想到的更改默认功能的唯一方法。

就像@J_A_X提议的那样,我修改了 DropDownList 类,添加一个计时器,该计时器将用户正在键入的字符串保留 3/4 秒,然后重置它。这是我的解决方案:

package MyComps
{
    import flash.events.TimerEvent;
    import flash.utils.Timer;
    import flash.utils.setTimeout;
import mx.core.mx_internal;
import spark.components.DropDownList;
use namespace mx_internal;
public class DropDownListKeyboardSelection extends DropDownList
{
    private var _duration:Number = 750; // Time in milliseconds before the _str is resetted
    private var _timer:Timer;
    private var _str:String = '';
    public function DropDownListKeyboardSelection()
    {
        super();
    }
    override mx_internal function findKey(eventCode:int):Boolean
    {
        if (!dataProvider || dataProvider.length == 0)
            return false;
        if (eventCode >= 33 && eventCode <= 126)
        {
            var matchingIndex:Number;
            var keyString:String = String.fromCharCode(eventCode);
            // Freshly instantiated or resetted by timerEnded(). In that case, we start the timer
            if (_str == '') {
                startTimer();
            }   else {
                _timer.reset();
                startTimer();
            }
            // Building the string to find
            _str += keyString;
            matchingIndex = findStringLoop(_str, 0, dataProvider.length); 
            // We didn't find the item, loop back to the top 
            if (matchingIndex == -1)
            {
                matchingIndex = findStringLoop(keyString, 0, 0); 
            }
            if (matchingIndex != -1)
            {
                if (isDropDownOpen)
                    changeHighlightedSelection(matchingIndex);
                else
                    setSelectedIndex(matchingIndex, true); 
                return true;
            }
        }
        return false;
    }
    // Let's start the _timer
    private function startTimer():void
    {
        _timer = new Timer(_duration);  
        _timer.addEventListener(TimerEvent.TIMER, timerEnded);
        _timer.start();
    }
    // Timer ended, let's reset the _str variable
    private function timerEnded(event:TimerEvent):void
    {   
        _str = '';
        _timer.reset();
    }
} 
}

我相信这取决于浏览器(如果使用标准列表元素)。您可以通过jquery创建一个自动完成字段(尽管这与下拉列表不同)。

最新更新