Autocomplete 自动补全(Webform实战篇)

简介: 开篇语 因为项目中需要用到一个自动补全的功能,功能描述: 需求一:新增收件人的时候,自动下拉显示出数据库中所有的收件人信息(显示的信息包括:姓名-收件地址-联系方式) 需求二:选中一个值得时候,分别赋值到对应文本框(收件人输入框中赋值 姓名,联系方式输入框中赋值 手机号,收件地址输入框中赋...

开篇语

因为项目中需要用到一个自动补全的功能,功能描述:

需求一:新增收件人的时候,自动下拉显示出数据库中所有的收件人信息(显示的信息包括:姓名-收件地址-联系方式)

需求二:选中一个值得时候,分别赋值到对应文本框(收件人输入框中赋值 姓名,联系方式输入框中赋值 手机号,收件地址输入框中赋值 地址)

 解决需求一(因本人比较懒,所以直接选用了一个比较方便的插件:Autocomplete [参考学习地址:http://www.runoob.com/jqueryui/jqueryui-use.html])

实现步骤

步骤① 去官网下载对应版本的包,然后在项目中添加这两个引用即可

 

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

步骤三③ 写查询及转换方法

1 在接口里面新增一个查询方法(接口只定义规则,不做具体实现)

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

3  方法里面调用这个方法进行json数据转换(通用方法可以直接使用)

 1 // var name = context.Request["name"];
 2             // 查询的参数名称默认为term 
 3             string query = context.Request.QueryString["term"];
 4             context.Response.ContentType = "text/javascript"; 
 5             DataTable sendInfoManage = CMSModelManager.SendInfoManageDAO.Method(query);//调用查询方法,返回一个DataTable
 6             //反序列化
 7             System.Web.Script.Serialization.JavaScriptSerializer serailizer = new System.Web.Script.Serialization.JavaScriptSerializer();
 8             List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
 9             Dictionary<string, object> row;
10             foreach (DataRow dr in sendInfoManage.Rows)
11             {
12                 row = new Dictionary<string, object>();
13                 foreach (DataColumn col in sendInfoManage.Columns)
14                 {
15                     row.Add(col.ColumnName, dr[col]);
16                 }
17                 rows.Add(row);
18             }
19 
20             string s= serailizer.Serialize(rows);
21             context.Response.Write(s);
View Code

步骤④ 页面接收返回数据和处理返回数据

 1  $(function() {
 2             var name = $("#ctl00_contentPlace_txtSender").val().trim();
 3             $("#ctl00_contentPlace_txtAddressee").autocomplete({
 4                 source: function(request, response) {
 5                     $.ajax({
 6                         url: "Handler.ashx",//请求地址
 7                         type: "post",//请求类型
 8                         data: { "name": name },//参数
 9                         success: function(data) {
10                             //console.log(data);  
11                             response($.map(eval(data), function(item) { //使用该插件必须要用eval()进行处理
12                                 //console.log(item);
13                                 return {
14                                     value: item.show,//赋值到控件上
15                                     result: item.show
16                                 }
17                             }));
18                        
19                         },
20                         error: function(xhr) {
21                             console.log("发生错误");
22                         }
23                     });
24                      
25                 },
26                    
27             });
28         });
29   
View Code

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

页面效果

补充:这个插件默认没有滚动条,需要手动添加样式(最大高度可以自行设定)

 1   <style type="text/css">
 2   .ui-autocomplete {
 3     max-height: 250px;
 4     overflow-y: auto;
 5     /* 防止水平滚动条 */
 6     overflow-x: hidden;
 7   }
 8   /* IE 6 不支持 max-height
 9    * 我们使用 height 代替,但是这会强制菜单总是显示为那个高度
10    */
11   * html .ui-autocomplete {
12     height: 250px;
13   }
14   </style>

解决需求二:特意查了下Autocomplete返回值处理情况,最终选用select做处理,最后请求的ajax改为:

 1   var showName = null;
 2     $(function() {
 3     $("#ctl00_contentPlace_txtAddressee").autocomplete({
 4             source: function(request, response) {
 5                 $.ajax({
 6                     url: "Handler.ashx", //请求地址
 7                     type: "post", //请求类型
 8                     data: { "name": $("#ctl00_contentPlace_txtAddressee").val().trim(), "look": $("#ctl00_contentPlace_txtSendCode").val().trim() }, //参数
 9                     success: function(data) {
10                         //console.log(data);  
11                         response($.map(eval(data), function(item) { //使用该插件必须要用eval()进行处理
12                             //console.log(item);
13                             return {
14                                 value: item.show, //赋值到控件上
15                                 result: item.show
16                             }
17                         }));
18 
19                     },
20                     error: function(xhr) {
21                         console.log("发生错误");
22                     }
23                 });
24             },
25             select: function(event, ui) {
26                 var li = (ui.item.label).split("-");
27                 $("#ctl00_contentPlace_txtAddressee").val(li[0]);
28                 console.log(li[0]);
29                 showName = li[0];
30                 $("#ctl00_contentPlace_txtContactInfo").val(li[2]);
31                 $("#ctl00_contentPlace_txtMailingAddress").val(li[1]);
32                 showNames();//可以继续调用其他方法
33             }
34         });
35     });
36     function showNames() {
37         console.log(showName);
38         if (showName != null) {
39             $("#ctl00_contentPlace_txtAddressee").val("");
40             $("#ctl00_contentPlace_txtMailContent").val("测试数据");
41         }
42     }
View Code

效果展示:

选中前

选中后

天了噜,什么,竟然收件人赋值不上,找了半天原因(清空后赋值等等)。。。。。

还是没找到问题,不过因为项目急着测试,就想了个偷懒的办法,用延时再赋值的方式调了下,终于可以了

所以最终版的前台请求如下

 1   var showName = null;
 2     $(function() {
 3     $("#ctl00_contentPlace_txtAddressee").autocomplete({
 4             source: function(request, response) {
 5                 $.ajax({
 6                     url: "Handler.ashx", //请求地址
 7                     type: "post", //请求类型
 8                     data: { "name": $("#ctl00_contentPlace_txtAddressee").val().trim(), "look": $("#ctl00_contentPlace_txtSendCode").val().trim() }, //参数
 9                     success: function(data) {
10                         //console.log(data);  
11                         response($.map(eval(data), function(item) { //使用该插件必须要用eval()进行处理
12                             //console.log(item);
13                             return {
14                                 value: item.show, //赋值到控件上
15                                 result: item.show
16                             }
17                         }));
18                     },
19                     error: function(xhr) {
20                         console.log("发生错误");
21                     }
22                 });
23             },
24             select: function(event, ui) {
25                 var li = (ui.item.label).split("-");
26                 $("#ctl00_contentPlace_txtAddressee").val(li[0]);
27                 console.log(li[0]);
28                 showName = li[0];
29                 $("#ctl00_contentPlace_txtContactInfo").val(li[2]);
30                 $("#ctl00_contentPlace_txtMailingAddress").val(li[1]);
31                 showNames();//可以继续调用其他方法
32             }
33         });
34     });
35     function showNames() {
36        if (showName != null) {
37          setTimeout(function()
38          {
39              $("#ctl00_contentPlace_txtAddressee").val(showName);
40              
41          },100); 
42       }
43     };
View Code

最终效果

至此,自动补全已经完成并满足需求,Autocomplete非常灵活,本文只是做了简单阐述和讲解

对Autocomplete插件更多参数和方法说明,请查阅 http://www.runoob.com/jqueryui/api-autocomplete.html 

  • 感谢你的阅读。如果你觉得这篇文章对你有帮助或者有启发,就请推荐一下吧~你的精神支持是博主强大的写作动力。欢迎转载!
  • 博主的文章没有高度、深度和广度,只是凑字数。由于博主的水平不高(其实是个菜B),不足和错误之处在所难免,希望大家能够批评指出。
  • 欢迎加入.NET 从入门到精通技术讨论群→523490820 期待你的加入
  • 不舍得打乱,就永远学不会复原。被人嘲笑的梦想,才更有实现的价值。
  • 我的博客:http://www.cnblogs.com/zhangxiaoyong/
目录
相关文章
|
8月前
|
编解码 并行计算 物联网
4G显存部署Flux,2分钟Wan2.1-14B视频生成,DiffSynth-Engine引擎开源!
魔搭社区的开源项目 DiffSynth-Studio 自推出以来,凭借其前沿的技术探索和卓越的创新能力,持续受到开源社区的高度关注与广泛好评。截至目前,该项目已在 GitHub 上斩获超过 8,000 颗星,成为备受瞩目的开源项目之一。作为以技术探索为核心理念的实践平台,DiffSynth-Studio 基于扩散模型(Diffusion Model),在图像生成和视频生成领域孵化出了一系列富有创意且实用的技术成果,其中包括 ExVideo、ArtAug、EliGen 等代表性模块。
1559 3
|
编解码 物联网 计算机视觉
实战 | 猫猫、少女、FLUX、ControlNet
魔搭社区集结了来自多个组织的 FLUX ControlNet 模型,魔搭社区的开源项目 DiffSynth-Studio 为这些模型提供了支持,今天就随我们一起,体验一下这些 FLUX ControlNet 模型的神奇生成能力。
|
存储 分布式计算 关系型数据库
Dataphin中如何使用Hologres外表查询MaxCompute
Hologres支持通过创建外部表来加速MaxCompute数据的查询,此方法用户直接在Hologres环境中访问和分析存储在MaxCompute中的数据,从而提高查询效率并简化数据处理流程。本文将介绍在 Dataphin 产品中如何实现这一操作。
539 1
|
机器学习/深度学习 人工智能 UED
OpenAI o1模型:AI通用复杂推理的新篇章
OpenAI发布了其最新的AI模型——o1,这款模型以其独特的复杂推理能力和全新的训练方式,引起了业界的广泛关注。今天,我们就来深入剖析o1模型的特点、背后的原理,以及一些有趣的八卦信息。
703 73
|
小程序
微信小程序-WXML包装元素
!> <block/> 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性,条件渲染默认只能控制被添加条件属性的那个组件,如果多个组件需要同时被控制,我们就可以使用 block,普通的组件上可能需要添加很多属性,如果再把条件渲染或者列表渲染同时添加到上面会导致我们代码的可读性很差。
173 0
|
分布式计算 大数据 Java
maxcompute函数问题之数据量较大经常OOM如何解决
MaxCompute函数包括内置函数和自定义函数(UDF),它们用于在MaxCompute平台上执行数据处理和分析任务;本合集将介绍MaxCompute函数的使用方法、函数编写和优化技巧,以及常见的函数错误和解决途径。
|
XML vr&ar Android开发
【Android App】实战项目之虚拟现实(VR)的全景相册(附源码和演示视频 可用于学习和大作业)
【Android App】实战项目之虚拟现实(VR)的全景相册(附源码和演示视频 可用于学习和大作业)
695 2
|
搜索推荐 C++
C++选择排序的实现
C++选择排序的实现
282 0
商标课堂开课啦——商标知多少?
商标课堂开课啦——商标知多少?
558 0
商标课堂开课啦——商标知多少?
|
存储 关系型数据库 MySQL
Docker | 容器数据卷详解
Docker | 容器数据卷详解
584 0
Docker | 容器数据卷详解