当前位置: 代码迷 >> Web前端 >> 相仿Google搜索提示的两种做法
  详细解决方案

相仿Google搜索提示的两种做法

热度:179   发布时间:2012-10-24 14:15:58.0
类似Google搜索提示的两种做法
做了个简单的搜索提示程序,类似google之类的搜索提示,就是输入一个内容时,会把开头对得上的内容显示出来。下面可以测试看看:


呵呵,这里没有显示有多少条结果,当然也要做到统计也是可以的。这里只做简单的显示。
下面就说说两种做法。
第一种,是在用户输入提示信息的时候,把用户输入的信息跟应用中存的数据进行比较,找出匹配的数据,然后 在list组件里显示出来

                      //输入文本内容变化事件
                        private function inputChangeEvent():void
                        {
                                //每次输入文字变化,都检索一下,查看数据是否变化
                                if(currMsg != searchText.text)
                                {
                                        currMsg = searchText.text;
                                        var seachData:ArrayCollection = new ArrayCollection();
                                        if(currMsg != "")
                                        {
                                                //在这里分析所有的内容,找出符合的内容
                                                for(var i:int = 0; i < source.length; i++)
                                                {
                                                        //逐个检索,是否具有输入的内容,有则存放进去
                                                        if(source[i].label.indexOf(currMsg) == 0)
                                                        {
                                                                seachData.addItem(source[i]);
                                                        }
                                                }
                                        }
                                        //显示是否有相关的搜索相关信息,如果没有就显示默认信息
                                        if(seachData.length == 0)
                                        {
                                                seachData = defaultData;
                                        }
                                        //显示出与搜索相关的信息
                                        searchMsgList.visible = true;
                                        searchMsgList.dataProvider = seachData;
                                }
                        }

恩,该函数是当输入文本框的内容有变化时触发的。代码的注释已经相当清晰了

接下来看另外一种处理发方法。其实大体的都差不多,这里只是对数据源刚传进来的时候,就马上对数据进行分析,归类,逐个分析,把具有相同内容的数据存放在一个数组里,最后把这些数据都和搜索内容捆绑,存放到一个集合里。所以当用户录入信息时,直接根据输入内容那分类好的数组就可以了
下面是传输数据源时的代码

                       /**
                         * 设置需要搜索的内容
                         * @param:内容数组
                         */  
                        public function setSearchDatas(source:Array):void
                        {
                                //这里是数据一传递进来,就开始做分析
                                //对这里里面的所有数据进行检索分类,以方便输入查询
                                for(var i:int = 0; i < source.length; i++)
                                {
                                        var key:String = source[i].label;
                                        //对字符串长度进行检索,并且分析,对每一个字符组合都存放起来
                                        for(var j:int = 1; j <= key.length; j++)
                                        {
                                                var str:String = key.substring(0,j);
                                                //从存放有相同标题的集合中取出来
                                                var strAry:ArrayCollection = searchMap[str] as ArrayCollection;
                                                if(strAry == null)
                                                {
                                                        strAry = new ArrayCollection();
                                                        searchMap[str] = strAry;
                                                }
                                                //存放完整的对象
                                                strAry.addItem(source[i]);
                                        }
                                }
                        }

然后下面是用户输入信息有变化时的相应函数

                       //输入文本内容变化事件
                        private function inputChangeEvent():void
                        {
                                //每次输入文字变化,都检索一下,查看数据是否变化
                                if(currMsg != searchText.text && currMsg != "")
                                {
                                        currMsg = searchText.text;
                                        //显示是否有相关的搜索相关信息,如果没有就显示默认信息
                                        var strAry:ArrayCollection = searchMap[currMsg] as ArrayCollection;
                                        if(strAry == null)
                                        {
                                                strAry = defaultData;
                                        }
                                        //显示出与搜索相关的信息
                                        searchMsgList.visible = true;
                                        searchMsgList.dataProvider = strAry;
                                }
                        }

最后总结一下,如果少量数据的话,应该都没什么区别。但是,如果有大量数据时,区别就来了。
第一方法比较简单,消耗的内存比较少,但是因为是即时分析数据源,所以搜索出来可能会稍微慢点。
第二种的话,因为实现已经分析好了,可以根据用户输入的内容马上从哈希表里取出对应数据。所以取数据反应会非常快。但是占用内存可能会多点(因为要根据每个字符串组合进行存放,不过其实也是增加多一些字符串,对象只是引用而已)。
同时还做一些细的优化,例如限制长度等等,至于怎么用,根据爱好了。如果数据量大的话,个人偏向第二种。这里的两种算法其实跟具体的CS3或者flex组件不相关的,只是用list来显示而已。
  相关解决方案