Autocomplete 自动补全(Webform实战篇)
开篇语
因为项目中需要用到一个自动补全的功能,功能描述:

需求一:新增收件人的时候,自动下拉显示出数据库中所有的收件人信息(显示的信息包括:姓名-收件地址-联系方式)
需求二:选中一个值得时候,分别赋值到对应文本框(收件人输入框中赋值 姓名,联系方式输入框中赋值 手机号,收件地址输入框中赋值 地址)
解决需求一(因本人比较懒,所以直接选用了一个比较方便的插件:Autocomplete [参考学习地址:http://www.runoob.com/jqueryui/jqueryui-use.html])
实现步骤
步骤① 去官网下载对应版本的包,然后在项目中添加这两个引用即可

步骤② 新建一个一般处理程序

步骤三③ 写查询及转换方法
1 在接口里面新增一个查询方法(接口只定义规则,不做具体实现)

2 继承接口并实现查询方法(因为功能需要,这里查询直接做了拼接,查询出来就是“收件人-地址-联系方式”)

3 方法里面调用这个方法进行json数据转换(通用方法可以直接使用)
// var name = context.Request["name"];
// 查询的参数名称默认为term
string query = context.Request.QueryString["term"];
context.Response.ContentType = "text/javascript";
DataTable sendInfoManage = CMSModelManager.SendInfoManageDAO.Method(query);//调用查询方法,返回一个DataTable
//反序列化
System.Web.Script.Serialization.JavaScriptSerializer serailizer = new System.Web.Script.Serialization.JavaScriptSerializer();
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
foreach (DataRow dr in sendInfoManage.Rows)
{
row = new Dictionary<string, object>();
foreach (DataColumn col in sendInfoManage.Columns)
{
row.Add(col.ColumnName, dr[col]);
}
rows.Add(row);
} string s= serailizer.Serialize(rows);
context.Response.Write(s);
步骤④ 页面接收返回数据和处理返回数据
$(function() {
var name = $("#ctl00_contentPlace_txtSender").val().trim();
$("#ctl00_contentPlace_txtAddressee").autocomplete({
source: function(request, response) {
$.ajax({
url: "Handler.ashx",//请求地址
type: "post",//请求类型
data: { "name": name },//参数
success: function(data) {
//console.log(data);
response($.map(eval(data), function(item) { //使用该插件必须要用eval()进行处理
//console.log(item);
return {
value: item.show,//赋值到控件上
result: item.show
}
}));
},
error: function(xhr) {
console.log("发生错误");
}
});
},
});
});

下图对应上图的数据呈现过程

页面效果

补充:这个插件默认没有滚动条,需要手动添加样式(最大高度可以自行设定)
<style type="text/css">
.ui-autocomplete {
max-height: 250px;
overflow-y: auto;
/* 防止水平滚动条 */
overflow-x: hidden;
}
/* IE 6 不支持 max-height
* 我们使用 height 代替,但是这会强制菜单总是显示为那个高度
*/
* html .ui-autocomplete {
height: 250px;
}
</style>
解决需求二:特意查了下Autocomplete返回值处理情况,最终选用select做处理,最后请求的ajax改为:
var showName = null;
$(function() {
$("#ctl00_contentPlace_txtAddressee").autocomplete({
source: function(request, response) {
$.ajax({
url: "Handler.ashx", //请求地址
type: "post", //请求类型
data: { "name": $("#ctl00_contentPlace_txtAddressee").val().trim(), "look": $("#ctl00_contentPlace_txtSendCode").val().trim() }, //参数
success: function(data) {
//console.log(data);
response($.map(eval(data), function(item) { //使用该插件必须要用eval()进行处理
//console.log(item);
return {
value: item.show, //赋值到控件上
result: item.show
}
})); },
error: function(xhr) {
console.log("发生错误");
}
});
},
select: function(event, ui) {
var li = (ui.item.label).split("-");
$("#ctl00_contentPlace_txtAddressee").val(li[0]);
console.log(li[0]);
showName = li[0];
$("#ctl00_contentPlace_txtContactInfo").val(li[2]);
$("#ctl00_contentPlace_txtMailingAddress").val(li[1]);
showNames();//可以继续调用其他方法
}
});
});
function showNames() {
console.log(showName);
if (showName != null) {
$("#ctl00_contentPlace_txtAddressee").val("");
$("#ctl00_contentPlace_txtMailContent").val("测试数据");
}
}
效果展示:
选中前

选中后

天了噜,什么,竟然收件人赋值不上,找了半天原因(清空后赋值等等)。。。。。
还是没找到问题,不过因为项目急着测试,就想了个偷懒的办法,用延时再赋值的方式调了下,终于可以了
所以最终版的前台请求如下
var showName = null;
$(function() {
$("#ctl00_contentPlace_txtAddressee").autocomplete({
source: function(request, response) {
$.ajax({
url: "Handler.ashx", //请求地址
type: "post", //请求类型
data: { "name": $("#ctl00_contentPlace_txtAddressee").val().trim(), "look": $("#ctl00_contentPlace_txtSendCode").val().trim() }, //参数
success: function(data) {
//console.log(data);
response($.map(eval(data), function(item) { //使用该插件必须要用eval()进行处理
//console.log(item);
return {
value: item.show, //赋值到控件上
result: item.show
}
}));
},
error: function(xhr) {
console.log("发生错误");
}
});
},
select: function(event, ui) {
var li = (ui.item.label).split("-");
$("#ctl00_contentPlace_txtAddressee").val(li[0]);
console.log(li[0]);
showName = li[0];
$("#ctl00_contentPlace_txtContactInfo").val(li[2]);
$("#ctl00_contentPlace_txtMailingAddress").val(li[1]);
showNames();//可以继续调用其他方法
}
});
});
function showNames() {
if (showName != null) {
setTimeout(function()
{
$("#ctl00_contentPlace_txtAddressee").val(showName); },100);
}
};
最终效果

至此,自动补全已经完成并满足需求,Autocomplete非常灵活,本文只是做了简单阐述和讲解
对Autocomplete插件更多参数和方法说明,请查阅 http://www.runoob.com/jqueryui/api-autocomplete.html
Autocomplete 自动补全(Webform实战篇)的更多相关文章
- jquery.autocomplete自动补全功能
项目实例: 一:js //SupplierAutoComplete.js $().ready(function () { $("#txtSupplier").autocomplet ...
- jQuery AutoComplete 自动补全
jQuery.AutoComplete是一个基于jQuery的自动补全插件.借助于jQuery优秀的跨浏览器特性,可以兼容Chrome/IE/Firefox/Opera/Safari等多种浏览器. 特 ...
- Pig autocomplete 自动补全
在pig的grunt环境下,按TAB键可以自动补全命令,用户可以添加自己的补全信息. 在conf目录下创建autocomplete文件,添加如下内容: hdfs://vm1:8020/ 在grun ...
- Bootstrap Typeahead/Jquery autocomplete自动补全
使用Bootstrap Typeahead 组件: Bootstrap 中的 Typeahead 组件就是通常所说的自动完成 AutoComplete,自动填充. 效果如图所示: 实现方式: 1.引入 ...
- jquery autocomplete自动补全
简单用法: $(function(){ var data = "the People's Republic of China".split(" "); $(&q ...
- WinForm AutoComplete 输入提示、自动补全
一.前言 又临近春节,作为屌丝的我,又要为车票发愁了.记得去年出现了各种12306的插件,最近不忙,于是也着手自己写个抢票插件,当是熟悉一下WinForm吧.小软件还在开发中,待完善后,也写篇博客与大 ...
- jquery autocomplete实现读取sql数据库自动补全TextBox
转自我本良人 原文 jquery autocomplete实现读取sql数据库自动补全TextBox 项目需要这样子一个功能,其他部门提的意见,只好去实现了哦,搞了好久才弄出来,分享一下. 1.前台页 ...
- gocode+auto-complete搭建emacs的go语言自动补全功能
上篇随笔记录了在emacs中使用go-mode和goflymake搭建了go语言的简单编程环境(推送门),今天来记录一下使用gocode+auto-complete配置emacs中go语言的自动补全功 ...
- autocomplete实现联想输入,自动补全
jQuery.AutoComplete是一个基于jQuery的自动补全插件.借助于jQuery优秀的跨浏览器特性,可以兼容Chrome/IE/Firefox/Opera/Safari等多种浏览器. 特 ...
随机推荐
- [机器学习] Ubuntu 软件源更新(校园网)以及问题总结
最近在折腾Linux,在校园网下怎么能够很好的获取软件很是让我头疼啊~~~ 总结一下吧!!! 首先是校园网的源地址: 清华大学:https://mirrors.tuna.tsinghua.edu.cn ...
- Thisgood
this is good test print 'haha'
- 【贪心】HDU 1257
HDU 1257 最少拦截系统 题意:中文题不解释. 思路:网上有说贪心有说DP,想法就是开一个数组存每个拦截系统当前最高能拦截的导弹高度.输入每个导弹高度的时候就开始处理,遍历每一个拦截系统,一旦最 ...
- 【总结】C# Access 数据库 增删查改 的简单步骤
引用集: using System.Data.OleDb; static string exePath = System.Environment.CurrentDirectory;//本程序所 ...
- 在VS2012下静态链接MFC的问题
1>------ 已启动生成: 项目: MFCApplication1, 配置: Debug Win32 ------1>uafxcwd.lib(afxctrlcontainer2.obj ...
- 如何删除 eclipse debugger 下不用的Java Application
问题描述:之前写了几个 main 函数 用于测试,现在删除掉了 但是debugger下还存在,看着不爽,想删掉 解决方案: 1.项目--右键 2.删掉就可以了
- js~~给网站图片添加水印~~~
因为朋友问我怎么加水印,引起了我的兴趣,没接触过也没想过要怎么写,所以试了试.写了一个简单的demo......
- 在linux中设置静态ip地址
在linux中设置静态ip地址1.在终端中输入:vi /etc/sysconfig/network-scripts/ifcfg-eth0 2.开始编辑,填写ip地址.子网掩码.网关.DNS等[root ...
- 【Silverlight】打开Silverlight程序报错,"未找到导入的项目......请确认<Import>声明中的路径正确,且磁盘上存在该文件"
在打开Silverlight程序时,报错(如图所示),程序使用的是Visual Studio 2013和最新的Silverlight版本(Silverlight5). 然后我在网上找了下说:Silve ...
- Mysql 学习笔记
创建表: create table testtable( id_ bigint not null AUTO_INCREMENT, name varchar(75) null, vmid varchar ...