何一

何一的博客

他的个人主页  他的博客

javascript实现可以下拉选择的文本框

何一  2010年01月14日 星期四 13:20 | 3288次浏览 | 4条评论

经过互联网上的搜索,最终的一牛人的解决办法,将onkeyup事件改为oninput事件可以成功解决
20100115完善了一下

        今天写了一个带下拉列表选择的文本框,实现的效果是:既可以下拉列表选择,又可以实现从文本框中直接输入,并且在输入的过程中,模糊查找下拉列表中的内容进行过滤。

        这样的输入框的好处是,既可以进行选择,又可以直接输入来查找过滤,代码如下,效果需要自己动手查看。

        有一个没有解决的问题是,输入中文进行过滤的时候,输入中文结束后,不切换输入法到英文状态,onkeyup事件没有相应,切换完输入法后才能正常过滤下拉列表,那位知道解决办法请踊跃留言探讨

<HTML>
    <HEAD>
        <LINK type="image/x-icon" rel="shortcut icon" href="./img/zeuux.ico"/>
        <TITLE>下拉文本输入框</TITLE>
        <SCRIPT type="text/javascript">
            function Fclick()
            {
                /***
                文本框获得焦点的时候显示下拉列表里面的所有内容
                ***/
                moptions = document.getElementById('s_id').options;
                document.getElementById('ul_id').innerHTML = '';
                for(i=0;i<moptions.length;i++)
                {    
                    str = '<LI onclick="SelectLi(' + "'" + moptions[i].text + "'"+ ')" onmouseout="backcolor(this);" onmouseover="changecolor(this);">' + moptions[i].text+'</LI>'
                    document.getElementById('ul_id').innerHTML += str;
                }
                document.getElementById('ul_id').style.display = '';
            }

            function Fmove(event)
            {
                /***
                文本框失去焦点的时候隐藏模拟的下拉列表层
                **/
                if(document.getElementById('hidden_id').value == 0)
                    document.getElementById('ul_id').style.display = 'none';
            }

            function Searchopt()
            {
                /***
                响应键盘输入,通过正则表达式匹配下拉列表的内容并显示在模拟的下拉列表层
                ***/
                str = document.getElementById('com_id').value;
                //var1 = '/' + str + '/i';
                var exreg = new RegExp(str);

                moptions = document.getElementById('s_id').options;
                document.getElementById('ul_id').innerHTML = '';
                for(i=0;i<moptions.length;i++)
                {    
                    if(exreg.test(moptions[i].text))
                    {
                        strre = '<LI onclick="SelectLi(' + "'" + moptions[i].text + "'"+ ')" onmouseout="backcolor(this);" onmouseover="changecolor(this);">' + moptions[i].text+'</LI>'
                        document.getElementById('ul_id').innerHTML += strre;
                    }
                }
                document.getElementById('ul_id').style.display = '';
            }
           
            function Schange()
            {    
                /***
                改变下拉列表值时,将内容显示到文本输入框中
                ***/
                sid = document.getElementById('s_id');
                sindex = sid.selectedIndex;
                document.getElementById('com_id').value = sid.options[sindex].text;
            }

            function SelectLi(value)
            {
                /***
                选中模拟下拉列表中的内容的时候,将内容显示到文本框中,并隐藏模拟层
                ***/
                document.getElementById('com_id').value = value;
                document.getElementById('ul_id').style.display = 'none';
            }

            function changecolor(mob)
            {
                /***
                鼠标移动到模拟层中的相应内容上时,改变其颜色,颜色可弄成和浏览器中默认下拉框获得焦点的时候的颜色一致,实现深度模拟
                ***/
                mob.style.backgroundColor = 'red';
            }

            function backcolor(mob)
            {
                /***
                鼠标离开模拟层对应内容上时,恢复其颜色
                ***/
                mob.style.backgroundColor = 'white';
            }

            function giveval(val)
            {
                /***
                隐藏变量,用于控制选择模拟下拉框时,文本输入框失去焦点的时候不关闭模拟下拉框
                ***/
                document.getElementById('hidden_id').value = val;
            }
       
        </SCRIPT>
    </HEAD>
    
    <BODY>
        <SELECT style="width:130px;" onchange="Schange();" id="s_id">
            <option>小明</option>
            <option>小红</option>
            <option>yaoqiang</option>
            <option>like</option>
            <option>niujie</option>
            <option>xiaofu</option>
            <option>xiaowang</option>
            <option>lizheng</option>
            <option>sunzong</option>
            <option>xiangzong</option>
       
        </SELECT>
       
        <!-- firefox使用oninput,ie使用onpropertychange -->
        <INPUT id="com_id" style="position:absolute;margin-left:-130px;width:109px;height:24px;margin-top:1px;" onfocus="Searchopt();" onblur="Fmove(event);" oninput="Searchopt();" onpropertychange="Searchopt();"/>
        <INPUT id='hidden_id' type="hidden" />
       
        <UL id="ul_id" style="list-style:none;position: absolute; left: 10px;top: 19px; padding-left: 0px; padding-top: 0px; font-size: 13px;
            border-style:solid; border-width: 1px; border-color:red; width: 126px; display: none;" onmouseover="giveval('1')" onmouseout="giveval('0')">
        </UL>
    </BODY>

</HTML>

 

评论

我的评论:

发表评论

请 登录 后发表评论。还没有在Zeuux哲思注册吗?现在 注册 !
Ford Guo

回复 Ford Guo  2010年01月14日 星期四 15:56

注释很详尽,不过如果能将注释换成一个更好的命名,就更不错了!

3条回复

  • 何一

    回复 何一  2010年01月15日 星期五 09:52

    注释换一个更好的名字,啥意思?

    2条回复

      • Ford Guo

        回复 Ford Guo  2010年01月15日 星期五 10:02

        就是一看你的变量命名,方法命名等就知道其作用是什么,这样既减少了注释,又增加了程序的可维护

        1条回复

          • 何一

            回复 何一  2010年01月15日 星期五 10:15

            恩,这些命名是自己写的时候想当然的命名,呵呵

            0条回复

暂时没有评论

Zeuux © 2024

京ICP备05028076号