步骤:

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. js获取gridview模板列中textbox行列的值

    下面一个例子:在gridview中第一列输入数值,第二列输入数值,点击第三列的时候进行计算 求和,如果不符合标记为红色字体. 如图: 代码 : <html xmlns="http:// ...

  2. 【转】安装OpenSSL缺失Microsoft Visual C++ 2008 Redistributables的解决方案

    from: http://www.cnblogs.com/luguo3000/p/3539815.html 在安装OpenSSL的时候通常会提示以下错误: "The Win32 OpenSS ...

  3. Discuz! 的编码规范

    http://open.discuz.net/?ac=document&page=dev_coderule 前言 本规范由编程原则组成,融合并提炼了开发人员长时间积累下来的成熟经验,意在帮助形 ...

  4. CSS选择器实现搜索功能 驱动过滤搜索技术

    一.CSS选择器可以用来实现搜索功能 CSS选择器可以用来实现搜索功能. 作者以前提过CSS3的选择器结合表单元素可以用来控制元素的显隐,这里,类似的,还是CSS3的选择器,用来过滤和搜索页面元素. ...

  5. jarsigner 签名android apk

    1.查看签名: jarsigner -verify app_signed.apk 查看是否签名,如果已经签名会打印 "jar verified". jarsigner -verif ...

  6. [原创]自定义view之:快速开发一款Material Design风格的dialog的开源项目MDDialog

    随着google开始主导Material Design风格的设计,越来越多的app开始使用Material Design风格来设计自己的UI.虽然在Android Studio中集成了多种快速开发框架 ...

  7. Jenkins xcodebuild There are no schemes in workspace

    Manage Schemes... 勾选 Shared 参考:http://stackoverflow.com/questions/14368938/xcodebuild-says-does-not- ...

  8. 【原】 COCOS2D—LUA 获取剪贴板内容

    android下: local luaj = require ("framework.luaj")   local ok,ret  = luaj.callStaticMethod( ...

  9. IPFS搭建分布式文件系统 - 访问控制

    IPFS 一个内容可寻址.对等的超媒体分发协议. IPFS网络中的节点形成分布式文件系统. 为什么要用IPFS? “IPFS and the Blockchain are a perfect matc ...

  10. 解决Spring+Quartz无法自动注入bean问题

    问题 我们有时需要执行一些定时任务(如数据批处理),比较常用的技术框架有Spring + Quartz中.无奈此方式有个问题:Spring Bean无法自动注入. 环境:Spring3.2.2 + Q ...