jQuery UI Autocomplete 体验分享


Posted in Javascript onFebruary 14, 2012

支持的数据源
jQuery UI Autocomplete主要支持字符串Array、JSON两种数据格式。
普通的Array格式没有什么特殊的,如下:

["cnblogs","博客园","?逶?]

对于JSON格式的Array,则要求有:label、value属性,如下:
[{label: "博客园", value: "cnblogs"}, {label: "?逶?, value: "?逶?}]

其中label属性用于显示在autocomplete弹出菜单,而value属性则是选中后给文本框赋的值。
如果没有指定其中一个属性则用另一个属性替代(即value和label值一样),如下:
[{label: "cnblogs"}, {label: "?逶?}] 
[{value: "cnblogs"}, {value: "?逶?}]

如果label和value都没有指定,则无法用于autocomplete的提示。
另外需要注意,对于从服务器端输出的JSON的key必须用双引号,如下:
[{"label": "博客园", "value": "cnblogs"}, {"label": "?逶?, "value": "?逶?}]

否则可能会出现parsererror错误。
主要的参数
jQuery UI Autocomplete常用的参数有:
Source:用于指定数据来源,类型为String、Array、Function
String:用于ajax请求的服务器端地址,返回Array/JSON格式
Array:即字符串数组 或 JSON数组
Function(request, response):通过request.term获得输入的值,response([Array])来呈现数据;(JSONP是这种方式)
minLength:当输入框内字符串长度达到minLength时,激活Autocomplete
autoFocus:当Autocomplete选择菜单弹出时,自动选中第一个
delay:即延迟多少毫秒激活Autocomplete
其他不常用的就不罗列了。
使用方法
假如页面上有以下输入框:
<input type="text" id="autocomp" />
AJAX请求
通过指定source为服务器端的地址来实现,如下:
$("#autocomp").autocomplete({ 
source: "remote.ashx", 
minLength: 2 
});

然后在服务器端接收,并输出相应结果,注意默认传递的参数名称为term:
public void ProcessRequest(HttpContext context) 
{ 
// 查询的参数名称默认为term 
string query = context.Request.QueryString["term"]; 
context.Response.ContentType = "text/javascript"; 
//输出字符串数组 或者 JSON 数组 
context.Response.Write("[{\"label\":\"博客园\",\"value\":\"cnblogs\"},{\"label\":\"?逶?",\"value\":\"?逶?"}]"); 
}

本地Array/JSON数组
// 本地字符串数组 
var availableTags = [ 
"C#", 
"C++", 
"Java", 
"JavaScript", 
"ASP", 
"ASP.NET", 
"JSP", 
"PHP", 
"Python", 
"Ruby" 
]; 
$("#local1").autocomplete({ 
source: availableTags 
}); 
// 本地json数组 
var availableTagsJSON = [ 
{ label: "C# Language", value: "C#" }, 
{ label: "C++ Language", value: "C++" }, 
{ label: "Java Language", value: "Java" }, 
{ label: "JavaScript Language", value: "JavaScript" }, 
{ label: "ASP.NET", value: "ASP.NET" }, 
{ label: "JSP", value: "JSP" }, 
{ label: "PHP", value: "PHP" }, 
{ label: "Python", value: "Python" }, 
{ label: "Ruby", value: "Ruby" } 
]; 
$("#local2").autocomplete({ 
source: availableTagsJSON 
});

Callback Function方式
通过指定source为自定义函数来实现自定义数据的获取,函数主要有2个参数(request,response),分别用于获取输入的值、呈现结果
本地Array方式获取数据(模仿新浪微博的登录)
var hosts = ["gmail.com", "live.com", "hotmail.com", "yahoo.com", "cnblogs.com", "火星.com", "?逶?com"]; 
$("#email1").autocomplete({ 
autoFocus: true, 
source: function(request, response) { 
var term = request.term, //request.term为输入的字符串 
ix = term.indexOf("@"), 
name = term, // 用户名 
host = "", // 域名 
result = []; // 结果 
result.push(term); 
// result.push({ label: term, value: term }); // json格式 
if (ix > -1) { 
name = term.slice(0, ix); 
host = term.slice(ix + 1); 
} 
if (name) { 
var findedHosts = (host ? $.grep(hosts, function(value) { 
return value.indexOf(host) > -1; 
}) : hosts), 
findedResults = $.map(findedHosts, function(value) { 
return name + "@" + value; //返回字符串格式 
// return { label: name + " @ " + value, value: name + "@" + value }; // json格式 
}); 
result = result.concat($.makeArray(findedResults)); 
} 
response(result);//呈现结果 
} 
});

JSONP方式获取数据
直接从官方DEMO拿来的,通过发送ajax请求到远程服务器,然后对返回结果进行处理,最后通过response来呈现:
$("#jsonp").autocomplete({ 
source: function(request, response) { 
$.ajax({ 
url: "http://ws.geonames.org/searchJSON", 
dataType: "jsonp", 
data: { 
featureClass: "P", 
style: "full", 
maxRows: 12, 
name_startsWith: request.term 
}, 
success: function(data) { 
response($.map(data.geonames, function(item) { 
return { 
label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName, 
value: item.name 
} 
})); 
} 
}); 
}, 
minLength: 2 
});

主要的事件
jQuery UI Autocomplete有一些事件,可用于在一些阶段进行额外的控制:
create(event, ui):Autocomplete创建时,可以在此事件中,对外观进行一些控制
search(event, ui): 在开始请求之前,可以在此事件中返回false来取消请求
open(event, ui):Autocomplete的结果列表弹出时
focus(event, ui):Autocomplete的结果列表任意一项获得焦点时,ui.item为获得焦点的项
select(event, ui):Autocomplete的结果列表任意一项选中时,ui.item为选中的项
close(event, ui):Autocomplete的结果列表关闭时
change(event, ui):当值改变时,ui.item为选中的项
这些事件的ui参数的item属性(如果有的话)默认有label和value属性,不管在source中设置的数据是Array还是JSON数组,如下3种:
["cnblogs","博客园","?逶?] 
[{label: "博客园", value: "cnblogs"}, {label: "?逶?, value: "?逶?}] 
[{label: "博客园", value: "cnblogs", id: "1"}, {label: "?逶?, value: "?逶?, id: "2"}]

假如是第三种的话,还可以得到ui.item.id的值。
这些事件可以通过2种方式来绑定,如下:
// 在参数中 
$("#autocomp").autocomplete({ 
source: availableTags 
, select: function(e, ui) { 
alert(ui.item.value) 
} 
}); 
// 通过bind来绑定 
$("#autocomp").bind("autocompleteselect", function(e, ui) { 
alert(ui.item.value); 
});

通过bind来绑定的方式使用的事件名称为"autocomplete"+事件名称,如"select"就是"autocompleteselect"。
多个值的Autocomplete
一般情况下,输入框的autocomplete仅需要一个值就可以(如:javascript);假如需要多个值(如:javascript,c#,asp.net),则需要绑定一些事件来进行额外处理:
在focus事件中返回false,避免输入框的值被autocomplete的单个值取代
在select事件中组合多个值
在元素的keydown事件做一些处理,理由同1
使用callback function方式的source,来获取最后输入的值,并呈现结果
还是直接拿官方DEMO的代码:
// 按逗号分隔多个值 
function split(val) { 
return val.split(/,\s*/); 
} 
// 提取输入的最后一个值 
function extractLast(term) { 
return split(term).pop(); 
} 
// 按Tab键时,取消为输入框设置value 
function keyDown(event) { 
if (event.keyCode === $.ui.keyCode.TAB && 
$(this).data("autocomplete").menu.active) { 
event.preventDefault(); 
} 
} 
var options = { 
// 获得焦点 
focus: function() { 
// prevent value inserted on focus 
return false; 
}, 
// 从autocomplete弹出菜单选择一个值时,加到输入框最后,并以逗号分隔 
select: function(event, ui) { 
var terms = split(this.value); 
// remove the current input 
terms.pop(); 
// add the selected item 
terms.push(ui.item.value); 
// add placeholder to get the comma-and-space at the end 
terms.push(""); 
this.value = terms.join(", "); 
return false; 
} 
}; 
// 多个值,本地数组 
$("#local3").bind("keydown", keyDown) 
.autocomplete($.extend(options, { 
minLength: 2, 
source: function(request, response) { 
// delegate back to autocomplete, but extract the last term 
response($.ui.autocomplete.filter( 
availableTags, extractLast(request.term))); 
} 
})); 
// 多个值,ajax返回json 
$("#ajax3").bind("keydown", keyDown) 
.autocomplete($.extend(options, { 
minLength: 2, 
source: function(request, response) { 
$.getJSON("remoteJSON.ashx", { 
term: extractLast(request.term) 
}, response); 
} 
}));

结尾
最后,放上代码:点击下载。
更多的资料请看jQuery UI Autocomplete官方演示:http://jqueryui.com/demos/autocomplete
Javascript 相关文章推荐
javascript按位非运算符的使用方法
Nov 14 Javascript
玩转方法:call和apply
May 08 Javascript
js上传图片及预览功能实例分析
Apr 24 Javascript
Node.js中JavaScript操作MySQL的常用方法整理
Mar 01 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
May 05 Javascript
用headjs来管理和加载js 提高网站加载速度
Nov 29 Javascript
Bootstrap下拉菜单样式
Feb 07 Javascript
原生JS写Ajax的请求函数功能
Dec 22 Javascript
基于jquery的on和click的区别详解
Jan 15 jQuery
bootstrap模态框关闭后清除模态框的数据方法
Aug 10 Javascript
基于webpack4.X从零搭建React脚手架的方法步骤
Dec 23 Javascript
解决vue 子组件修改父组件传来的props值报错问题
Nov 09 Javascript
JavaScript/jQuery 表单美化插件小结
Feb 14 #Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
Feb 13 #Javascript
情人节之礼 js项链效果
Feb 13 #Javascript
jQuery.getScript加载同域JS的代码
Feb 13 #Javascript
理解JavaScript的prototype属性
Feb 11 #Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
Feb 11 #Javascript
基于jquery实现状态限定编辑的代码
Feb 11 #Javascript
You might like
关于页面优化和伪静态
2009/10/11 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
2014/05/04 PHP
php使用function_exists判断函数可用的方法
2014/11/19 PHP
Javascript 判断 object 的特定类转载
2007/02/01 Javascript
支持ie与FireFox的剪切板操作代码
2009/09/28 Javascript
JS代码优化技巧之通俗版(减少js体积)
2011/12/23 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
2014/10/21 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
2015/06/10 Javascript
javascript精确统计网站访问量实例代码
2015/12/19 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
获取JS中网页各种高宽与位置的方法总结
2016/07/27 Javascript
AngularJS 应用身份认证的技巧总结
2016/11/07 Javascript
bootstrap datetimepicker日期插件使用方法
2017/01/13 Javascript
echarts学习笔记之箱线图的分析与绘制详解
2017/11/22 Javascript
node链接mongodb数据库的方法详解【阿里云服务器环境ubuntu】
2019/03/07 Javascript
jquery实现的分页显示功能示例
2019/08/23 jQuery
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
2019/09/30 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
Vue 自适应高度表格的实现方法
2020/05/13 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
Vue中inheritAttrs的使用实例详解
2020/12/31 Vue.js
[45:46]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS DT
2014/05/23 DOTA
Python中列表、字典、元组、集合数据结构整理
2014/11/20 Python
django在接受post请求时显示403forbidden实例解析
2018/01/25 Python
Python实现两个list求交集,并集,差集的方法示例
2018/08/02 Python
python进行TCP端口扫描的实现
2018/12/21 Python
Python单例模式的四种创建方式实例解析
2020/03/04 Python
函数指针的定义是什么
2016/08/14 面试题
学校党的群众路线教育实践活动对照检查材料
2014/09/24 职场文书
个人创业事迹材料
2014/12/30 职场文书
2019教师的学习计划
2019/06/25 职场文书
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL
使用 Docker Compose 构建复杂的多容器App
2022/04/30 Servers