当我们使用百度或是谷歌进行搜索时,只要输入一个字母就可以产生一个下拉列表,并且可以通过键盘上下键来控制列表项的选择。最近在项目中也碰到了类似的情况,在文本框中输入某个字母就可以出现一个下拉列表,展现从数据库里搜索过来的结果。
先说一下我的实现思路吧,当用户在文本框中输入时,可以利用ajax方式将文本框内内容传给后台的某个页面,在那个页面中经过处理后将产生的结 果(这里的结果是一个字符串数组)再获取过来在前台呈现。有了思路后就开始考虑怎么去具体实现吧。首先要使用ajax的话,就想到可以使用jQuery提 供的$.post()方法,这个方法可带4个参数,分别是:
·url,请求的页面URL地址;
·data(可选),作为HTTP消息的实体内容发送给服务器;
·callback(可选),载入成功后的回调函数,自动将请求结果和状态传递给该方法;
·type(可选),服务器端返回的数据格式,可以是:xml、html、script、json等。
好,现在对$.post()方法有了一定的了解,现在就可以考虑这个方法该怎么来写了。在我的项目中,请求的URL地址是@Url.Action("GetTags") (由于是ASP.NET MVC架构,地址是由Routing配置产生的,这个转义到前台就是一个普通的URL地址),需要传送的是ID为newTag的文本框中的值,所以第二个 参数为{pinyins: $("#newTag").val()},这里的pinyins是由后台定义的。第三个参数callback是处理请求成功后要做的事,暂且命名为 pinyinCallback,第四个参数设为'json',即数据格式为一个JSON对象。这样的话,这个ajax请求可以写为:
$.post('@Url.Action("GetTags")', { pinyins: $("#newTag").val() }, pinyinCallback, 'json');
但是如果用户每输入一个字母就立即往服务器传的的话,服务器的承载就会过大,于是考虑可以将每次请求延迟一秒发送,于是发送请求的方法可以这样定义:
function pinyinOption() { var t = setTimeout(function () { $.post('@Url.Action("GetTags")', { pinyins: $("#newTag").val() }, pinyinCallback, 'json'); }, 1000); }
现在要考虑的就是这个方法在何时调用。既然是以用户输入结果来查询的,那么可以考虑jQuery的keyup事件,可以在文本框(id为newTag)的 keyup事件触发后就调用之前定义的方法。但是又考虑到这个功能中可以通过键盘中上下键来控制列表中的选项,所以这个keyup事件可以这样来定义:
$("#newTag").keyup(function (e) { if (e.keyCode != 40 && e.keyCode != 38) { currentTxt = $("#newTag").val(); pinyinOption(); } }).focus(function () { this.select(); });
其中keyCode值38、40分别代表上键和下键。currentTxt记录的是当前文本框的内容。
当请求成功后的回调函数pinyinCallback该做什么呢?这个回调函数该做的应该有这些事,首先要把请求来的数据在前台呈现出来,这样就需要创建一些新的DOM元素来装这些内容。就不废话了,直接上代码吧:
Html代码:
<div class="mb20 pr f14 ff" id="tagDiv"> <p><span>新标签</span> <input id="newTag" type="text" style = "border: 1px solid #555;height: 20px;"autocomplete ="off" /> </div>
js代码:
var $resultDiv = $('<div id="resultDiv" class="pa f12 ff"></div>'); var $resultUl = $('<ul id="resultUl"></ul>'); var $resultLi = []; var currentTxt; function pinyinCallback(data) { $("#resultDiv").show(); $resultUl.html(""); for (var i = 0; data[i]; i++) { $resultLi[i] = $("<li></li>"); $resultLi[i].html(data[i]); $resultUl.append($resultLi[i]); } if ($resultUl.html() == "") { $("#resultDiv").hide(); } $resultUl.appendTo($resultDiv); $resultDiv.appendTo($("#tagDiv")); }
目前这个回调函数只是将请求回来的数据添加到创建的id为resultDiv的容器内,再将这个容器添加到页面中已存在的id为tagDiv的容器中。而为了美观一点并为了实现点击一个列表项就提交的功能,这个回调函数还可以做这些工作:
js代码:
$("#resultDiv li").hover(function () { $(this).addClass("esultDivLiHover"); }, function () { $(this).removeClass("esultDivLiHover"); }); $("#resultDiv").blur(function () { $("#resultDiv").hide(); }); $("#resultDiv li").click(function (event) { $("#newTag").val($(this).text()); $("form").submit(); });
css代码:
#resultDiv { left: 47px; border: 1px solid #000; background: #fff; z-index: 100; width: 200px; } #resultDiv li { cursor: default; padding: 2px 4px; } .esultDivLiHover { background: #cfcfcf; }
在列表项被点击后就提交一次表单,并把当前文本框的内容设置为列表项的内容。
接下来就要实现键盘上下键控制的功能了,这样,全部的回调函数代码为:
function pinyinCallback(data) {
$("#resultDiv").show();
$resultUl.html("");
for (var i = 0; data[i]; i++) {
$resultLi[i] = $("<li></li>");
$resultLi[i].html(data[i]);
$resultUl.append($resultLi[i]);
}
if ($resultUl.html() == "") {
$("#resultDiv").hide();
}
$resultUl.appendTo($resultDiv);
$resultDiv.appendTo($("#tagDiv"));
$("#resultDiv li").hover(function () {
$(this).addClass("esultDivLiHover");
}, function () {
$(this).removeClass("esultDivLiHover");
});
$("#resultDiv").blur(function () {
$("#resultDiv").hide();
});
$("#resultDiv li").click(function (event) {
$("#newTag").val($(this).text());
$("form").submit();
});
//键盘上下键控制
var index = -1; //标记上下键时所处位置
document.documentElement.onkeydown = function (e) {
e = window.event || e;
if (e.keyCode == 40) { //下键操作
if (++index == $("#resultDiv li").length) { //判断加一操作后index值是否超出列表数目界限
index = -1; //超出的话就将index值变为初始值
$("#newTag").val(currentTxt); //并将文本框中值设为用户用于搜索的值
$("#resultDiv li").removeClass("esultDivLiHover");
}
else {
$("#newTag").val($($("#resultDiv li")[index]).text());
$($("#resultDiv li")[index]).siblings().removeClass("esultDivLiHover").end().addClass("esultDivLiHover");
}
}
if (e.keyCode == 38) { //上键操作
if (--index == -1) { //判断自减一后是否已移到文本框
$("#newTag").val(currentTxt);
$("#resultDiv li").removeClass("esultDivLiHover");
}
else if (index == -2) { //判断index值是否超出列表数目界限
index = $("#resultDiv li").length - 1;
$("#newTag").val($($("#resultDiv li")[index]).text());
$($("#resultDiv li")[index]).siblings().removeClass("esultDivLiHover").end().addClass("esultDivLiHover");
}
else {
$("#newTag").val($($("#resultDiv li")[index]).text());
$($("#resultDiv li")[index]).siblings().removeClass("esultDivLiHover").end().addClass("esultDivLiHover");
}
}
};
}
OK,现在这个功能就差不多搞定了,在ie6下也是完全正常,不过还是有一些bug需要改进,另外这个方法还是有可以优化的地方吧。晒一晒效果图:
相关推荐
**jQuery仿百度搜索框下拉热门关键词...总的来说,这个功能通过jQuery实现了百度搜索框的热门关键词下拉列表,提升了用户体验。理解并掌握这个例子,有助于开发者更好地运用jQuery来构建交互性强、响应迅速的Web界面。
在本文中,我们将探讨如何使用jQuery实现一个仿百度搜索时的下拉列表功能。这个功能允许用户在输入框中输入文字时,通过Ajax异步请求从服务器获取匹配的搜索结果,并显示在一个下拉列表中。同时,用户还可以使用键盘...
本项目“jquery仿百度下拉列表搜索框”旨在利用jQuery的功能,模仿百度搜索引擎的智能下拉列表功能,提供用户友好的模糊查询体验。 首先,我们要了解jQuery的核心概念。jQuery通过一种简化的语法,使开发者可以更...
标题中的“仿百度 谷歌下拉提示 纯jquery 实现”指的是利用JavaScript库jQuery来创建一种功能,该功能模拟了百度和谷歌搜索引擎在用户输入时显示下拉建议的效果。这种效果能够提高用户体验,因为用户无需完整输入...
本文将通过分析“jQuery仿百度搜索框下拉热门关键词列表代码”这个项目,深入探讨如何使用jQuery实现这一功能。 首先,我们要了解这个项目的基本结构。压缩包中的文件包括`index.html`(主页面)、`img`(图片资源...
本示例中的"jQuery仿百度搜索框下拉代码"是利用jQuery实现的一种常见用户界面功能,它模仿了百度搜索引擎的搜索框下拉提示功能。这种功能提高了用户体验,让用户可以更快捷地找到并输入想要搜索的关键词。 首先,...
总结起来,实现“jQuery仿百度搜索时的下拉列表”主要包括以下步骤: 1. 使用$.post()发送Ajax请求,获取数据库中的匹配项。 2. 在keyup事件上监听文本框输入,延迟发送请求。 3. 定义回调函数处理返回的JSON数据,...
在IT行业中,实现类似百度和谷歌的搜索下拉效果是一项常见的需求,这能极大地提升用户体验。本项目以"php+ajax"技术栈为基础,旨在创建一个动态的搜索建议功能,让用户在输入关键字时就能看到相关的搜索建议,无需...
这个项目“用php+ajax写的仿百度谷歌搜索下拉自动提示框效果”旨在实现类似百度和谷歌搜索引擎的实时搜索建议功能。下面我们将详细探讨这个过程涉及的关键知识点。 首先,我们要理解**PHP**(Hypertext ...
本项目"JSP+ajax仿百度输入提示下拉列表"就是利用这两种技术来实现类似百度搜索框的实时输入提示功能,为用户提供友好且高效的输入体验。 首先,我们需要理解JSP的基础。JSP是一种服务器端脚本语言,它允许开发者在...
本项目"jQuery仿百度搜索框下拉特效代码"旨在实现与百度搜索相似的功能,即在用户输入时显示一个下拉列表,推荐热门关键词,从而提高搜索效率。 首先,我们要理解jQuery的核心概念。jQuery通过封装JavaScript的DOM...
最后,为了提供更好的用户体验,我们可以添加一些额外的功能,如高亮显示匹配的文本,或者在用户点击下拉列表中的某一项时,自动填充输入框并隐藏下拉列表。 总结起来,这个项目涵盖了以下关键知识点: 1. jQuery...
【标题】"仿百度下拉菜单"涉及到的是前端开发中的一种常见交互设计,它主要目的是为了提供用户友好的界面体验,使用户能够方便地通过下拉列表选择或搜索信息。在网页或者应用中,这种下拉菜单通常与搜索功能结合,...
【描述】:在实现“仿百度下拉”功能时,首先需要确保数据库已经正确附加并准备就绪,因为这一功能的核心是通过查询数据库中的数据来生成下拉建议。通常,这个过程分为以下几个步骤: 1. **前端准备**:引入jQuery...
总结,jQuery仿百度搜索下拉框自动补全代码插件typeahead.js,以其高效、灵活的特点,成为了网页开发中实现搜索功能智能化的得力工具。通过理解其工作原理和应用场景,开发者可以轻松创建出符合用户需求的智能搜索框...
**Ajax仿百度搜索下拉提示实现详解** 在Web开发中,提供实时的搜索建议或智能提示功能已经成为一种标准,这可以极大地提升用户的搜索体验。本篇文章将深入探讨如何使用Ajax技术模仿百度搜索的下拉提示功能,以实现...
**jQuery仿百度模糊查询**是基于JavaScript库jQuery实现的一种高效、动态的搜索功能,它能够模仿百度搜索引擎的实时搜索体验,即用户在输入框中输入关键词时,系统会即时匹配并显示相关的数据列表。这种技术在网站...
**jQuery仿百度自动提示**是一种常见的前端开发技术,主要用于实现搜索框或输入框中的自动补全功能,提高用户输入效率和用户体验。这个技术基于JavaScript库jQuery,通过监听用户输入,实时从服务器或本地数据中匹配...