JQuery UI 是以 JQuery 为基础的开源 JavaScript 网页用户界面代码库。包含底层用户交互、动画、特效和可更换主题的可视控件,这些控件主要包括:Accordion,Autocomplete,ColorPicker,Dialog,Slider,Tabs,DatePicker,Magnifier,ProgressBar,Spinner等,其中Autocomplete能够非常容易的帮我们实现类似于百度搜索的智能提示功能。最新JQuery UI可以从JQuery UI官网下载获得。
官网及示例:http://jqueryui.com/autocomplete/
效果图:
入门实例:
首先引入依赖库:
css/jquery-ui.css css/style.css js/jquery-1.9.1.js js/jquery-ui.js添加个简单的输入框:
<body> <input id="autocomplete" > </body>
创建:
$(function() { var availableTags = [ "ActionScript", "AppleScript", "Asp", "BASIC", "C", "C++", "Clojure", "COBOL", "ColdFusion", "Erlang", "Fortran", "Groovy", "Haskell", "Java", "JavaScript", "Lisp", "Perl", "PHP", "Python", "Ruby", "Scala", "Scheme" ]; $( "#autocomplete" ).autocomplete({ source: availableTags }); });
好了,ok。创建完毕,很简单。
核心句是:$( "#autocomplete" ).autocomplete({....}), 即:将上面的文本框设置为自动补全组件(autocomplete ),同时可以设置自定义参数。其中source参数必须设置,它设置了检索的数据来源,即:当我们在文本框中输入后,组件会在source指定的数据源中模糊检索。autocomplete 提供了丰富且灵活的数据源,如下:
有以下几种数据源:
1、string数组参数,格式:[ "Choice1", "Choice2" ]
如上面示例中的方式。
2、object数组参数,格式[ { label: "Choice1", value: "value1" }, ... ]其中label是在匹配菜单中显示项的值,而value,是选中此匹配项后,append到<input>中的真实值(input的value属性值)
如:
$( "#autocomplete" ).autocomplete({source:[ { label: "ActionScript", value: "ActionScript" },{ label: "AppleScript", value: "AppleScript" }]});
3、string参数
如果是string参数,则是指定一个远程的数据源,然后当<input>中有输入变化,即change事件后,会自动将输入的内容,以GET方式发送到远程数据源,其中输入内容以term参数保存;
例如,参数为http://remoteSource,那么在用户输入abc后,将会发送一个GET请求如http://remoteSource?term=abc
返回的结果必须以json格式,数据格式如上面1、2描述
例如:
$( "#autocomplete" ).autocomplete({ source:"index2.jsp" });后台index2.jsp 可如下写:
<body> <% String term = request.getParameter("term"); response.setContentType("text/plain;charset=UTF-8"); response.getWriter().write("[ \"choice1\", \"choice2\" ]"); response.getWriter().flush(); response.getWriter().close(); %> </body>
4、Function(request, response),最具有灵活性的一种方式,可用于返回任何数据源方式来实现自动完成,其中包含两个参数request,response通过request.term 来获取用户输入的值,通过response(argument)来对获取的数据源进行显示。
$ ( ".selector" ). autocomplete ({ source: function(request,response){ //获取用户输入 var term = request.term; //根据自定义方式从服务器获取数据 ... //还可以自己解析数据 .. //最后把数据按照前面1、2描述的格式,放到response中 response(data); } });
例如:
$( "#autocomplete" ).autocomplete({ source: function( request, response ) { var term = request.term; $.ajax({ url: "index3.jsp", dataType: "json", data: {"term": term}, success: function( data ) { response(data); } }) } });后台index3.jsp可如下写:
<body> <% String term = request.getParameter("term"); response.setContentType("text/plain;charset=UTF-8"); response.getWriter().write("[{ \"label\": \"C# Language\", \"value\": \"C#\" },{ \"label\": \"C++ Language\", \"value\": \"C++\" }]"); response.getWriter().flush(); response.getWriter().close(); System.out.println(term); %> </body>
功能支持:
此自动补全功能,支持<input><textarea>或者有contenteditable 属性的标签
键盘操作:
1、上下键 可以选择匹配项
2、esc建 可以关闭匹配菜单
3、enter建 可以选择当前选中的匹配项
4、pageup pagedown 可以操作匹配菜单中的滚动条
CSS:
1、ui-autocomplete:匹配菜单中匹配项的css属性
2、ui-autocomplete-input:输入框的属性
除了设置source参数外,还提供了以下可选的参数:
$( ".selector" ).autocomplete({ appendTo: "#someElem" });autoFocus:
默认为false,设置成true时,则匹配菜单中的第一个匹配项,会默认被选中,效果如下图:
delay
在按键后执行搜索的延时,默认为300ms。
$( ".selector" ).autocomplete({ delay: 500 });
disabled
是否禁用autocomplete 组件,默认为false。
$( ".selector" ).autocomplete({ disabled: true });
minLength
触发自动完成功能需要输入的最小字符数量。
$( ".selector" ).autocomplete({ minLength: 0 });
position
设置匹配菜单的相对位置
默认值{ my: "left top", at: "left bottom", collision: "none" }
$( ".selector" ).autocomplete({ position: { my : "right top", at: "right bottom" } });
其中,"my" 代表匹配菜单,"at"代表输入 input文本框,简单的说就是设置二者的重合点,即默认设置是:匹配菜单的左上角与input文本框的左下角重合,效果如上图所示。
事件
change( event, ui )
当input文本框失去焦点,并且被选中的项改变时,触发该事件。
$( ".selector" ).autocomplete({ change: function( event, ui ) {} });
被选中的项被保存在ui的item对象中,如果没有任何项被选中则ui的item对象为null。
close( event, ui )
当匹配菜单隐藏时,触发该事件。
$( ".selector" ).autocomplete({ close: function( event, ui ) {} });
注:close事件与change事件不能一同使用。
create( event, ui )
当autocomplete 组件创建时触发
$( ".selector" ).autocomplete({ create: function( event, ui ) {} });
focus( event, ui )
当鼠标或焦点移到匹配菜单的另一个item(未被选中的)时触发,
select( event, ui )
当一个menu项被选择后,触发该事件。同时会将被选择的项放到ui的item对象中。
$( ".selector" ).autocomplete({ select: function( event, ui ) {} });
search( event, ui )
在开始请求之前发生,如果在search中返回false,则当前的检索请求将被取消。此事件发生在minLength
和 delay
后。
response( event, ui )
在搜索完成后匹配菜单显示前发生,可以在此事件中对显示菜单进行处理,修改搜索到的匹配菜单。搜索到的菜单列表封装在ui.content中。
在上面代码的基础上加个response事件,例如:
$( "#autocomplete" ).autocomplete({ source: function( request, response ) { var term = request.term; $.ajax({ url: "index3.jsp", dataType: "json", data: {"term": term}, success: function( data ) { response(data); } }) }, response: function( event, ui ) { $.each(ui.content, function(index, item){ item.label = item.label + "0"; item.value = item.value + "0"; }) } });简单的将每个菜单项的末尾加个"0", 来演示response可以对搜索到的匹配菜单进行修改。
更多的详细使用,可查看官方文档:http://api.jqueryui.com/autocomplete