jQuery实现仿百度搜索时的下拉列表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
当我们使用百度或是谷歌进行搜索时,只要输入一个字母就可以产生一个下拉列表,并且可以通过键盘上下键来控制列表项的选择。最近在项目中也碰到了类似的情况,在文本框中输入某个字母就可以出现一个下拉列表,展现从数据库里搜索过来的结果。
AD:
先说一下我的实现思路吧,当用户在文本框中输入时,可以利用ajax方式将文本框内内容传给后台的某个页面,在那个页面中经过处理后将产生的结果(这里的结果是一个字符串数组)再获取过来在前台呈现。有了思路后就开始考虑怎么去具体实现吧。首先要使用ajax的话,就想到可以使用jQuery提供的$.post()方法,这个方法可带4个参数,分别是:
·url,请求的页面URL地址;
·data(可选),作为HTTP消息的实体内容发送给服务器;
·callback(可选),载入成功后的回调函数,自动将请求结果和状态传递给该方法;
·type(可选),服务器端返回的数据格式,可以是:xml、html、script、json等。
好,现在对$.post()方法有了一定的了解,现在就可以考虑这个方法该怎么来写了。在我的项目中,请求的URL地址是@Url.Action("GetTags")(由于是 MVC架构,地址是由Routing配置产生的,这个转义到前台就是一个普通的URL地址),需要传送的是ID为newTag的文本框中的值,所以第二个参数为{pinyins: $("#newTag").val()},这里的pinyins是由后台定义的。第三个参数callback是处理请求成功后要做的事,暂且命名为pinyinCallback,第四个参数设为'json',即数据格式为一个JSON对象。这样的话,这个ajax请求可以写为:
1.$.post('@Url.Action("GetTags")', { pinyins: $("#newTag").val() }, piny
inCallback, 'json');
但是如果用户每输入一个字母就立即往服务器传的的话,服务器的承载就会过大,于是考虑可以将每次请求延迟一秒发送,于是发送请求的方法可以这样定义:
1.function pinyinOption() {
2. var t = setTimeout(function () {
3. $.post('@Url.Action("GetTags")', { pinyins: $("#newTag").v
al() }, pinyinCallback, 'json');
4. }, 1000);
5.
6. }
现在要考虑的就是这个方法在何时调用。既然是以用户输入结果来查询的,那么可以考虑jQuery的keyup 事件,可以在文本框(id为newTag)的keyup事件触发后就调用之前定义的方法。但是又考虑到这个功能中可以通过键盘中上下键来控制列表中的选项,所以这个keyup事件可以这样来定义:
1.$("#newTag").keyup(function (e) {
2. if (e.keyCode != 40 && e.keyCode != 38) {
3.currentTxt = $("#newTag").val();
4. pinyinOption();
5. }
6. }).focus(function () {
7. this.select();
8. });
其中keyCode值38、40分别代表上键和下键。currentTxt记录的是当前文本框的内容。
当请求成功后的回调函数pinyinCallback该做什么呢?这个回调函数该做的应该有这些事,首先要把请求来的数据在前台呈现出来,这样就需要创建一些新的DOM元素来装这些内容。就不废话了,直接上代码吧:
Html代码:
1.
2.
新标签
@Html.TextBox("newTag", null, new { style = "border: 1px solid #555;height: 20px;", autocomplete ="off"})
3.@
4.
1.var $resultDiv = $('
');2. var $resultUl = $('
3. var $resultLi = [];
4. var currentTxt;
5.
6. function pinyinCallback(data) {
7. $("#resultDiv").show();
8. $resultUl.html("");
9. for (var i = 0; data[i]; i++) {
10. $resultLi[i] = $("
");11. $resultLi[i].html(data[i]);
12. $resultUl.append($resultLi[i]);
13. }
14. if ($resultUl.html() == "") {
15. $("#resultDiv").hide();
16. }
17. $resultUl.appendTo($resultDiv);
18. $resultDiv.appendTo($("#tagDiv"));
19. }
目前这个回调函数只是将请求回来的数据添加到创建的id为resultDiv的容器内,再将这个容器添加到页面中已存在的id为tagDiv的容器中。而为了美观一点并为了实现点击一个列表项就提交的功能,这个回调函数还可以做这些工作:
js代码:
1.$("#resultDiv li").hover(function () {
2. $(this).addClass("esultDivLiHover");
3. }, function () {
4. $(this).removeClass("esultDivLiHover");
5. });
6. $("#resultDiv").blur(function () {
7. $("#resultDiv").hide();
8. });
9. $("#resultDiv li").click(function (event) {
10. $("#newTag").val($(this).text());
11. $("form").submit();
12. });
css代码:
1.#resultDiv
2. {
3. left: 47px;
4. border: 1px solid #000;
5. background: #fff;
6. z-index: 100;
7. width: 200px;
8.
9. }
10. #resultDiv li
11. {
12. cursor: default;
13. padding: 2px 4px;
14. }
15. .esultDivLiHover
16. {
17. background: #cfcfcf;
18. }