步骤:

1、在文本框中输入内容时,触发keyup事件;

2、在keyup事件的处理方法中,通过Ajax调用控制器的方法;

3、在控制器方法中,搜索满足条件的数据,这里分页获取数据,且只取第一页的数据,返回Json数据;

4、JavaScript处理返回的数据,拼HTML,生成列表框,并为列表框添加鼠标点击事件;

说明:

1、实现了通过上下键和Enter键选择列表项功能;

2、使用jQuery给文本框添加事件,尽量避免直接使用JavaScript,这样就不用考虑浏览器兼容问题了,因为jQuery已经做了。

3、经过测试,支持IE、火狐、谷歌浏览器,测试使用的三种浏览器均为当前较新的版本。

一、HTML代码和CSS代码:

<tr>
<td class="tdTitle">
<span style="color: Red;">*</span>学校名称:
</td>
<td>
<div>
<input id="sclName" type="text" name="edu_Grade.Scl.Name" class="tipInput" tip=""
value="#{edu_Grade.Scl.Name}" autocomplete="off" />
<span class="valid" msg="学校名称不能为空" mode="" rule="" ajaxaction="#{ajaxCheckUrl}">
</span>
<input id="hidSclName" type="hidden" name="edu_Grade.Scl" value="#{edu_Grade.Scl.Id}" />
<!--模糊搜索结果显示div-->
<div id="divSel" style="border: solid 1px #666; height: 95px; width: 200px; background-color: #fff;
position: absolute; display: none; overflow: auto; z-index: 99999;">
</div>
</div>
</td>
</tr>
<style type="text/css">
.divItem:hover
{
cursor: pointer;
}
.divItem:nth-child(even)
{
background-color: #e9e9e9;
}
.tdTitle
{
width: 120px;
text-align: right;
}
.itemHighlight
{
background-color: #6666aa !important;
cursor: pointer;
}
</style>

二、JavaScript代码:

<script type="text/javascript">
_run(function () {
$("#sclName").keyup(function (event) {
searchSchool(event); //模糊搜索学校
});
$("#sclName").keydown(function (event) {
searchKeyDown(this, event); //上下键和Enter键
});
$("body").click(function () {
$("#divSel").css("display", "none"); //模糊搜索结果显示div
});
}); //模糊搜索学校
var lastKey = "";
function searchSchool(evt) {
var key = $.trim($("#sclName").val()); //取用户输入的关键字 if (key == "" && evt.keyCode != 38 && evt.keyCode != 40 && evt.keyCode != 13) { //如果用户输入的关键字为空,则不搜索
$("#divSel").css("display", "none");
return;
} if (key != lastKey && evt.keyCode != 38 && evt.keyCode != 40 && evt.keyCode != 13) {
$.ajax({
type: "GET",
url: "#{searchSchoolUrl}",
data: "key=" + escape(key), //传参
success: function (data) {
if (data.length && data.length != 0) { //如果结果不为空
maxIndex = data.length - 1;
$("#divSel").css("display", ""); var html = "";
for (var i = 0; i < data.length; i++) {
html += "<div onclick='divItemClick(this)' itemId='" + data[i].Id + "' itemIndex='" + i + "' class='divItem' onmouseover='divItemMouseOver(this)' >" + data[i].Name + "</div>";
} $("#divSel").html(html);
$("#sclName").css("border", "solid 1px #000");
}
else { //搜索不到结果
$("#sclName").css("border", "dashed 1px red");
$("#divSel").css("display", "none");
$("#hidSclName").val("");
} if (data.length = 1) { //搜索结果有且只有一个
$("#hidSclName").val(data[0].Id);
}
}
});
}
} //模糊搜索结果选项点击事件
function divItemClick(obj) {
$("#sclName").val($(obj).text());
$("#sclName").css("color", "#000");
$("#hidSclName").val($(obj).attr("itemId"));
$("#sclName").focus();
$("#divSel").css("display", "none");
$("#sclName").blur();
} //上下键和Enter键
var itemIndex = -1;
var maxIndex = -1;
function searchKeyDown(obj, evt) {
if (evt.keyCode != 38 && evt.keyCode != 40 && evt.keyCode != 13) {
itemIndex = -1;
} var key = $.trim($("#sclName").val()); //取用户输入的关键字
lastKey = key; if (evt.keyCode == 40) { //下移 if (itemIndex >= 0) {
var preItem = $("#divSel").find("div:eq(" + itemIndex + ")");
preItem.removeClass("itemHighlight");
}
if ($("#divSel").find("div:eq(" + (itemIndex + 1) + ")").length > 0) {
itemIndex++;
}
else {
itemIndex = 0;
}
var item = $("#divSel").find("div:eq(" + itemIndex + ")");
item.addClass("itemHighlight"); if ($("#divSel").scrollTop() < item.height() * (itemIndex - 4) || $("#divSel").scrollTop() > item.height() * (itemIndex + 4)) {
$("#divSel").scrollTop(item.height() * (itemIndex - 4));
}
} if (evt.keyCode == 38) { //上移
if (itemIndex >= 0) {
var preItem = $("#divSel").find("div:eq(" + itemIndex + ")");
preItem.removeClass("itemHighlight");
}
if (itemIndex > 0) {
itemIndex--;
}
else {
itemIndex = maxIndex;
}
var item = $("#divSel").find("div:eq(" + itemIndex + ")");
item.addClass("itemHighlight"); if ($("#divSel").scrollTop() > item.height() * itemIndex || $("#divSel").scrollTop() < item.height() * (itemIndex - 4)) {
$("#divSel").scrollTop(item.height() * itemIndex);
}
} if (evt.keyCode == 13) { //Enter
var item = $("#divSel").find("div:eq(" + itemIndex + ")");
item.click();
var key = $.trim($("#sclName").val()); //取用户输入的关键字
lastKey = key;
evt.returnValue = false;
}
} //鼠标移入
function divItemMouseOver(obj) {
var item = $("#divSel").find("div");
item.removeClass("itemHighlight");
itemIndex = parseInt($(obj).attr("itemIndex"));
item = $(obj);
item.addClass("itemHighlight");
$("#sclName").focus();
}
</script>

三、控制器代码:

/// <summary>
/// 查询学校
/// </summary>
public void SearchSchool()
{
string key = (string)ctx.Get("key"); List<Edu_School> sclList = edu_SchoolService.GetListByNameKey(key);//根据关键字查询学校集合
if (sclList != null && sclList.Count > )
{
List<Dictionary<string, string>> dicList = new List<Dictionary<string, string>>(); foreach (Edu_School scl in sclList)
{
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("Id", scl.Id.ToString());
dic.Add("Name", scl.Name);
dicList.Add(dic);
} echoJson(dicList);
}
else
{
echoText(null);//搜索不到返回空
}
}

效果图:

给文本框添加模糊搜索功能(“我记录”MVC框架下实现)的更多相关文章

  1. winform中文本框添加拖拽功能

    对一个文本框添加拖拽功能: private void txtFolder_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataP ...

  2. Silverlight中文本框添加回车事件后,换行无法清除的解决方法

    在开发Silverlight的项目中,为了更好的用户体验,我们常要给一些控件添加一些快捷键.然而,在Silverlight中当用户回车提交后,光标停留在文本框的第二行怎么也清除不掉,经过一段时间研究, ...

  3. WinForm -- 为TextBox文本框添加鼠标右键菜单

    WinForm -- 为TextBox文本框添加鼠标右键菜单 1. 新建一个WinForm项目,放置一个TextBox控件 2. 从工具箱拖进来一个ContextMenuStrip 3. 将TextB ...

  4. Web控件文本框Reset的功能

    在前一篇中<怎样实现Web控件文本框Reset的功能>http://www.cnblogs.com/insus/p/4120889.html Insus.NET只实现了文本框的功能.单个或 ...

  5. 给tkinter文本框添加右键菜单

    给tkinter文本框添加右键菜单 需求:直接右键点击使用tkinter创建的文本框是不会弹出菜单的.我们需要实现右键点击tkinter框架下的Entry对象.Text对象后弹出右键菜单可复制.粘贴和 ...

  6. python开发_tkinter_获取文本框内容_给文本框添加键盘输入事件

    在之前的blog中有提到python的tkinter中的菜单操作 python开发_tkinter_窗口控件_自己制作的Python IDEL_博主推荐 python开发_tkinter_窗口控件_自 ...

  7. 基于JQuery实现的文本框自动填充功能

    1. 实现的方法 /* * js实现的文本框的自动完成功能 */ function doAutoComplete(textid,dataid,url){ $("#" + texti ...

  8. html文本框(input)不保存缓存记录

    有的时候js往文本框里赋值,结果在火狐中刷新后,刚才赋的值还在,导致好多麻烦的事情,现总结一下解决办法如下: <input name="bestlovesky"  type= ...

  9. ASP.NET输入文本框自动提示功能

    在ASP.NET Web开发中会经常用到自动提示功能,比如百度搜索.我们只要输入相应的关键字,就可以自动得到相似搜索关键字的提示,方便我们快速的输入关键字进行查询. 那么在ASP.NET中,如果我们需 ...

随机推荐

  1. Scala 深入浅出实战经典 第46讲: ClassTag 、Manifest、ClasMainifest TagType实战

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  2. android自定义seekBar

    Android原生控件只有横向进度条一种,而且没法变换样式,比如原生rom的样子 很丑是吧,当伟大的产品设计要求更换前背景,甚至纵向,甚至圆弧状的,咋办,比如 ok,我们开始吧: 一)变换前背景 先来 ...

  3. 倒计时,js

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  4. 持续集成(二)环境搭建篇—内网邮件server搭建

    在我们的持续构建中,项目构建中出现错误提醒.或者开发者之间的沟通交流,进度汇报的事务,都是离不开一个通信工具.那就是邮件.在我们的项目开发中假设使用第三方的邮件平台,这肯定不是最好的选择.由于第三方的 ...

  5. IP和端口的意义

    百科说明 在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型.物理端口指的是物理存在的端口,如ADSL Modem.集线器.交换机.路由器上用 于连接其他网络设备的接口,如RJ-45端口.S ...

  6. Xcode7.x中安装Alcatraz

    将Xcode升级了,发现Alcatraz失效了: xcode7.x安装插件命令:curl -fsSL https://raw.github.com/supermarin/Alcatraz/master ...

  7. 【Cocos2d-Js基础教学(5)资源打包工具的使用及资源的异步加载处理】

    TexturePacker是纹理资源打包工具,支持Cocos2dx的游戏资源打包. 如果用过的同学可以直接看下面的资源的异步加载处理 首先为什么用TexturePacker? 1,节省图片资源实际大小 ...

  8. Spark源码系列(五)分布式缓存

    这一章想讲一下Spark的缓存是如何实现的.这个persist方法是在RDD里面的,所以我们直接打开RDD这个类. def persist(newLevel: StorageLevel): this. ...

  9. Eclipse+Selenium自动化测试脚本设计V1.0

    Eclipse+Selenium自动化测试脚本设计V1.0 http://www.docin.com/p-803032251.html

  10. make menuconfig出错解决方法

     make menuconfig出错解决方法 2011-06-11 22:22:49 分类: 系统运维 错误现象: make menuconfig In file included from scri ...