jq 之Autocomplete 引发联想及思考

  前情纪要:JQuery UI 是以 JQuery 为基础的开源 JavaScript 网页用户界面代码库。包含底层用户交互、动画、特效和可更换主题的可视控件,这些控件主要包括:Accordion,Autocomplete,ColorPicker,Dialog,Slider,Tabs,DatePicker,Magnifier,ProgressBar,Spinner等,其中Autocomplete能够非常容易的帮我们实现类似于百度搜索的智能提示功能。

我现在要实现的是在订单中心下单时,实现通过输入客户名智能查询出客户详细信息(只展示客户名,电话或证件号并实现自动加载到页面选中的数据详情)。



原版实现:指定标签(input)输入时或者单击标签时获取到数据源展示课选中。

1:图片展示:

2:底层代码示例:

3:js代码示例:



但是代码是copy别人的自己没有啥子理解,突然想起来有个同事说:我们最大的缺点就是“不求甚解”,让他说中了。

今天要在另一个页面实现类似的功能,就又copy了一下,但是却有一些问题导致功能不能实现:

  问题如下:多个输入框要实现同样的数据加载。以前是直接指定标签绑定并且传值也是指定的标签,但是现在是要动态绑定事件并且拿对应标签的值。

想起来也不难,就是通过js 中的this 对象就可以获取到当前的事件绑定标签的值。但是在autocomplete 方法中this对象获取到的this对象是window(当前窗体)。

  js采用面向对象方法书写(最近才在一个原同事的分享会上学习到的)采用live方法绑定可以实现类似于click方法的动态绑定,这也是今天自己实在是逼得不行了采取主动学习这部分的知识,学习js标签绑定原理后才知道的方法。(心理活动:每天都告诉要学习一点知识,但是有时候还是不求甚解,这种心态是一个程序员成长的最大敌人。)

  解决问题一:动态加载标签后自动调用已声明的js 方法再绑定一次autocomplete方法(还没有试验通过live方法绑定autocomplete,明天可以尝试用一下)。

  解决问题二:向后台传值问题。原先是通过标签选择器获取指定的标签值获取其value。现在标签时动态加载的尝试使用this对象获取失败后另寻它径。准备换change事件然后通过ajax方法实现,试验后发现可以拿到数据,但是实现的效果对比于百度搜索的样式有一些差距,并且很麻烦(这是一条可行的方法,但是与最初的预期有一些偏差,人生就是一个个选择,在不同的路口选择不同的方向,技术之路也一样)。转而再次研究autocomplete方法。

        通过阅读官方文档发现,其实autocomplete其实有三种不同额数据源获取方法,我们是采用了其中调用本方法get请求到数据然后解析,还有人通过xml、session都能实现同样的功能,另外一种先在ajax中获取数据源,在成功方法中调用autocomplete方法,真是一个好的思路,最后的方法我回想感觉类似于我刚才的上一次尝试通过change方法ajax拿数据,然后处理。继续研究,当我看别人博客看到下面文字的时候如梦惊醒:

  formatItem: function(row, i, max) { }

    //结果中的每一行都会调用这个函数,返回值将用LI元素包含,显示在下拉列表中. 三个参数(row, i, max): 返回的结果数组, 当前处理的行数(从1开始), 当前结果数组元素的个数. Default: none, 表示不指定自定义的处理函数.

  formatResult : function(row, i, max) { }

    //和formatItem类似,但可以将将要输入到input文本框内的值进行格式化.同样有三个参数,和formatItem一样.Default: none,表示要么是只有数据,要么是使用formatItem提供的值.

  formatMatch: function(row) { }

    //对每一行数据使用此函数格式化需要查询的数据格式. 返回值是给内部搜索算法使用的. 参数值row

  result (function(event, data, formatted){}) //此事件会在用户选中某一项后触发,参数为:event: 事件对象, data: 选中的数据行,formatted:formatResult函数返回的值;

  这是四个插件内的方法,原版实现中有用到,但是如果没有去研究绝对不会知道它们每一个是什么作用,现在才知道了formatitem方法内是对数据源处理显示下拉列表;result方法是选中一行后执行的逻辑。(又一次感叹毛主席说的话“一天不学习,赶不上刘少奇”,是多么正确的。)

  看到这些熟悉的方法之后我就有预感今天这个问题能解决(我已经研究了近一个半小时了),于是我又对所有参数进行了一次学习,黄天不负苦心人。

extraParams (Object):

    //为后台(一般是服务端的脚本)提供更多的参数.和通常的作法一样是使用一个键值对对象.如果传过去的值是{ bar:4 },将会被autocompleter解析成my_autocomplete_backend.php?q=foo&bar=4 (假设当前用户输入了foo). Default: {}

  我们原程序中传值name:‘‘,这里写到{bar:4} ,被autocompleter解析成my_autocomplete_backend.php?q=foo&bar=4 (假设当前用户输入了foo),

  当我看到假设当前用户输入了foo,并且q=foo之后我就断定,后台接收的参数中必定有一个q,于是我在后台接收方法中调用 Request["q"],果然获取到了在页面标签内输入的值,

并且在request对象中又两个默认的参数:limit 代表每页数据(js中有设定,由此反思到以前获取数据源的方法是没有做数据分页的),temp...时间戳(具体单词记不住了),由此解决了我的这个问题。

  最后还是通过努力,用原方法实现出了最初的设计,在此感谢博主“PeterZhang” 的一篇博客。还有就是自己不放弃的精神,回想起来自己是有很多不懂得地方,还有很多原理,

很多具体的实现,以及这个插件这么设计的优缺点,和设计者的设计思想自己还真是没有吃透。

  做一个程序员,真的怕“不求甚解”。

  



下面附上最后的实现代码:

1:底层代码:

2:js实现:

3:效果图片:



autocomplete一些参数:

 1  minChars: 0,           //至少输入的字符数,default:1;如果设为0,在输入框内双击或者删除内容时显示列表。
 2
 3   width: 220,           //下拉框的宽度,default:input元素的宽度
 4
 5   max: 10,            //下拉项目的个数,default:10
 6
 7   scrollHeight: 300,       // 下拉框的高度, Default: 180
 8
 9   scroll: true,            //当结果集大于默认高度时,是否使用滚动条,Default: true
10
11   multiple: false,         //是否允许输入多个值. Default: false
12
13   autoFill: false,          // 是否自动填充. Default: false
14
15   multipleSeparator: " ",      //输入多个字符时,用来分开各个的字符. Default: ","
16
17   matchCase:false,         //是否开启大小写敏感
18
19   selectFirst:true,           // 如果设置成true,下拉列表的第一个值将被自动选择, Default: true
20
21   matchSubset:true,          //是否启用缓存
22
23   cacheLength: 10,             //缓存的长度.即缓存多少条记录.设成1为不缓存.Default: 10
24
25   delay: 20,             //击键后的延迟时间(单位毫秒).Default: 远程为400 本地10
26
27   mustMatch:false,              //如果设置为true,只会允许匹配的结果出现在输入框,当用户输入的是非法字符时,将被清除, Default: false
28
29   matchContains:true,       //决定比较时是否要在字符串内部查看匹配.Default: false
30
31   formatItem: function(row, i, max) { }
32
33     //结果中的每一行都会调用这个函数,返回值将用LI元素包含,显示在下拉列表中. 三个参数(row, i, max): 返回的结果数组, 当前处理的行数(从1开始), 当前结果数组元素的个数. Default: none, 表示不指定自定义的处理函数.
34
35   formatResult : function(row, i, max) { }
36
37     //和formatItem类似,但可以将将要输入到input文本框内的值进行格式化.同样有三个参数,和formatItem一样.Default: none,表示要么是只有数据,要么是使用formatItem提供的值.
38
39   formatMatch: function(row) { }
40
41     //对每一行数据使用此函数格式化需要查询的数据格式. 返回值是给内部搜索算法使用的. 参数值row
42
43   result (function(event, data, formatted){}) //此事件会在用户选中某一项后触发,参数为:event: 事件对象, data: 选中的数据行,formatted:formatResult函数返回的值;
44
45     例如: $("#d").result(function(event, data, formatted){alert(formatted);})
46
47   extraParams (Object):
48
49     //为后台(一般是服务端的脚本)提供更多的参数.和通常的作法一样是使用一个键值对对象.如果传过去的值是{ bar:4 },将会被autocompleter解析成my_autocomplete_backend.php?q=foo&bar=4 (假设当前用户输入了foo). Default: {}



谢谢,希望还能在技术这条路上再走一走。  

时间: 2024-10-21 01:30:44

jq 之Autocomplete 引发联想及思考的相关文章

一个回车符引发的问题思考

在维护和开发通信类软件产品的过程中,经常需要处理一些软件故障问题.在问题刚出现的时候,大家可能显得手足无措,有一种天都要塌下来的感觉.但在问题原因找到之后,大家又会觉得问题原因非常的简单,要是当初开发的时候仔细一点,是不会犯这样的低级错误的.最近,本人就遇到了一个回车符引发的问题. 近日,在开发某软件版本时需要对文件进行操作,在代码中使用了Linux C语言中的opendir函数,但是该函数始终返回NULL,提示文件路径不存在. 本人查了一下该函数的具体情况.opendir函数的原型为: DIR

display:inline-block引发的间隙思考

一.导火线 没错,总有一类属性在助你轻松寻得捷径的同时,也可为你增添烦劳,比如本文的主谋display:inline-block.众前端们所诸知,其作用是将对象呈递为内联对象,但是对象的内容作为块对象呈递.旁边的内联对象会被呈递在同一行内,允许空格.然而不幸的是,它并没有得到所有浏览器的支持,比如ie6.7和古老一点的firefox完全无视它,由于firefox的老版本几乎已经从市场中消失,所以名义上firefox是支持display:inline-block的,除此之外,伟大的chrome.O

由“Beeline连接HiveServer2后如何使用指定的队列(Yarn)运行Hive SQL语句”引发的一系列思考

背景 我们使用的HiveServer2的版本为0.13.1-cdh5.3.2,目前的任务使用Hive SQL构建,分为两种类型:手动任务(临时分析需求).调度任务(常规分析需求),两者均通过我们的Web系统进行提交.以前两种类型的任务都被提交至Yarn中一个名称为“hive”的队列,为了避免两种类型的任务之间相互受影响以及并行任务数过多导致“hive”队列资源紧张,我们在调度系统中构建了一个任务缓冲区队列,所有被提交的任务(手动任务.调度任务)并不会直接被提交至集群,而是提交至这个缓冲区队列中,

long和BigDecimal引发的管理思考

关于long.double.BigDecimal在效率.可用性.灵活性等等方面的技术性讨论和测试其实在网上已经很多了,本文也不是打算讨论他们的实现的,其实笔者也曾在很长的职业生涯周期中一度拘泥于此.但是渐渐的,已经对此没有那么的一根筋在乎了,至少从整个决策思路而言. 在涉及到金额或金融的计算中,有些时候为了显示或者严格准确性的要求,很多初级开发会毫不犹豫的选择BigDecimal,毕竟无论是java官方还是教科书都是这么说的.随着开发经验的增加.对性能优化的关注等等各种原因,很多的项目或系统开始

由SpringJdbc引发的一点思考

本来项目中使用的是Hibernate,后来换Mybatis,但由于项目中很多sql语句是动态的,无实体,参数不固定,列也不固定,Mybatis显得太重量了,所以我又选择用spring jdbc这种更轻量的封转替换掉原来的jdbc,更换dao层真心让我想吐了. 其实,无论Spring jdbc,Hibernate,还是mybatis都是对jdbc的封装,封装不变的部分,留下可变的部分让我们自己写. 使用 Spring jdbc,其实最主要的是使用它的三个模板,Spring的JdbcTemplate

有 a - b < c 引发的安全性思考

软件工程中,不论使用哪种开发语言,安全性一直是一个非常棘手却又重要的问题.安全性是软件开发领域永远的主题之一,而且随着互联网的蜂拥发展而带动的新技术的兴起与革命(比如近几年火起来的node.js,python,go等,甚至微软也开源后的.net Core),软件工程中的安全性更加的凸显与重要了. 那么,什么才是危险的呢?我的第一反应是注入攻击,比如SQL注入攻击.一个典型的场景是WEB应用中,用户登陆功能,根据用户输入的用户名密码获取相应的数据,那么SQL注入就应运而生,模拟用户名,密码加入特殊

程序员删数据库事件引发的个人思考

最近周围的人都在讨论程序员删数据库这件事情,业内的人在讨论怎么才能锁住数据库并删掉.外行的人在谴责这个程序员的职业道德.中午朋友给我聊起这件事情的时候,我感觉没有那么简单,只是给朋友说,事情估计没有网上说的那么简单,毕竟这个只是那个创业老板的一面之词.等到晚上的时候,事情居然出现了反转,是这位老板严重扭曲了事实,让这个程序员精神受到了严重的损害. 当晚上看到这个程序员的信件之后,我突然感觉好像一下子感悟到了什么.对周围的事情,当你没有自己的判断标准和深入思考的话,非常容易陷入浅尝辄止的漩涡,容易

乱码引发的编码思考

转载请声明:http://blog.csdn.net/softmanfly/article/details/43611985 乱码是软件开发中的常见问题,程序员如果对码不清楚的话经常会被各种码搞得晕头转向,我在开发一个JavaWeb项目时也遇到了一些乱码的问题,百思不得其解,最后通过阅读源码和一定的猜测,对编码和乱码问题有了一定的心得体会,故记录下来(如果只想深入了解Java中的编码相关内容的话可以直接看红字下面的部分): 问题来由:在http get方法中url后面添加query string

由一次惨痛的数据灾难引发的彻底思考

概述 前一段时间硬盘突然崩了,这几乎要让我所有的艰辛努力都毁于一旦,因为我所有的劳动成果都存储在硬盘中. 事实上,我之前的数据备份与安全工作已经做的不错了,对数据经常进行备份,而且分散存储,并进行了加密,由于一直以来数据并没有发生过丢失,久而久之,数据备份的频率越来越低,最近一次备份在本地磁盘已经是十几天之前了,听上去还不错,但是整个硬盘都报废了,最近一次备份到网盘已经是两个月前的事情了,听上去还不算太坏,但雪上加霜的是,由于担心通过压缩加密的备份不安全的问题,在这次数据灾难前已经删除了所有存储