html推荐词功能

本文探讨了一个前端经典功能——实时搜索下拉框的实现,通过监听输入框的onchange事件并使用防抖技术优化请求频率。在用户输入时延迟请求,渲染搜索建议列表,并处理鼠标移入高亮、点击搜索及失去焦点隐藏等交互细节。代码示例展示了如何处理点击事件以防止因blur事件提前触发导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能的要求是:在用户输入文本的时候发送到服务器,然后在搜索栏下面生成下拉框,点击下拉框的内容触发搜索,注意交互的效果,鼠标移入高亮显示,只有输入时才显示下拉框,点击下拉框和其它空白处隐藏,类似于百度搜索的效果

这是一个比较经典的功能,因为是通过监听输入框的onchange事件实现的,触发频率非常高几乎是实时的,当然我们不可能实时去请求后台接口,而是用逻辑去判断空隙时间,也就是使用setTimeout延时请求,也就是经常被称之为防抖的技术,处理完这个问题之后,剩下的就是渲染列表,绑定点击事件和鼠标悬停效果,和焦点的丢失事件,所以虽然是一个小功能,想做好还不是很容易,把任务分解一下,具体可以分为三步

1.监听输入框的onchange事件,在空隙时间中请求服务器 

2.拿到的列表数据渲染到dom,鼠标移入高亮点击要发出搜索请求 

3.如果输入框的焦点丢失了要隐藏下面的内容

部分源码如下,使用中间变量current取前一次的值,每一次输入框的变动之后的0.5秒判断,判断前一次值和当前值如果不相等就发送请求

            //监听的逻辑
            function listenInput() {
                let current = ''

                $('input').keydown(function (event) {

                    setTimeout(function () {
                        if (current != $('input').val()) {
                            getRequest(null, app.GetApi("GetKeywords"), {
                                    para: $('input').val()
                                },

                                (res) => {
                                    if (res.Result.length) {
                                        renderKeywordList(res.Result);
                                    }
                                }
                            );
                        } else {
                            console.warn('输入过快');
                        }
                        current = $('input').val();

                    }, 500);
                })
            }
            //因为输入框没有dom的变化,所以不需要重复绑定
			$('input').blur(function () {
				$('#keyword-list').css('border', 'none');
				$('#keyword-list').html('');
			})

            //渲染的逻辑
            function renderKeywordList(Result) {
                let content = '';
                const itemStyle = `style= "line-height:50px; cursor:pointer;"`

                Result.forEach(element => {
                        content += `<div ${itemStyle}>${element}</div>`
                });

                $('#keyword-list').css('border', '1px solid #ccc');
                $('#keyword-list').html(content);

                $('#keyword-list div').mousedown(function () {
					//把输入框的值设置未点击的项
                    $('input').val(this.innerHTML);
                    $("#search").click();
					
					//把输入框dom置空
                    $('#keyword-list').css('border', 'none');
                    $('#keyword-list').html('');
                });
				
                //鼠标移入移出事件
                $('#keyword-list div').mouseenter(function () {
                    $(this).css('background', '#ccc');
                })
	
                $('#keyword-list div').mouseleave(function () {
                    $(this).css('background', '#fff');
                })
            }

划重点,$('#keyword-list div').mousedown()不能使用$('#keyword-list div').click()替代,因为blur事件会在click之前触发,一旦点击了下拉框中的div,会先执行blur的回调,导致值没传过去就被清空了,click事件会在mousedown和mouseup之后触发,也就是按下和松开鼠标构成一个点击事件,触发顺序mousedown>mouseup>blur>click,为啥我会知道呢

 有不懂和错误的地方欢迎提问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

free5156

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值