jQuery.Autocomplete 是jquery的流行插件,能夠很好的實作輸入框的自動完成(autocomplete)、建議提示(input suggest)功能,支援ajax資料加載。
官方網站: http://jqueryui.com/autocomplete/
官網上的一個完整的簡單例子:
- <!doctype html>
- <html lang="en">
- <head>
- <meta charset="utf-8">
- <title>jQuery UI Autocomplete - Default functionality</title>
- <link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
- <script src="//code.jquery.com/jquery-1.10.2.js"></script>
- <script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
- <link rel="stylesheet" href="/resources/demos/style.css">
- <script>
- $(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"
- ];
- $( "#tags" ).autocomplete({
- source: availableTags
- });
- });
- </script>
- </head>
- <body>
- <div class="ui-widget">
- <label for="tags">Tags: </label>
- <input id="tags">
- </div>
- </body>
- </html>
一 資料源的指定
此功能最主要的參數是source,設定比對菜單中的資料項,設定方式:
1、string數組參數,格式:[ "Choice1", "Choice2" ]
- 初始化時:
- $( ".selector" ).autocomplete({ source: [ "c++", "java", "php", "coldfusion", "javascript", "asp", "ruby" ] });
- 初始化後
- // getter
- var source = $( ".selector" ).autocomplete( "option", "source" );
- // setter
- $( ".selector" ).autocomplete( "option", "source", [ "c++", "java", "php", "coldfusion", "javascript", "asp", "ruby" ] );
2、object數組參數,格式[ { label: "Choice1", value: "value1" }, ... ]
其中label是在比對菜單中顯示項的值,而value,是選中此比對項後,append到<input>中的真實值
3、string參數
如果是string參數,則是指定一個遠端的資料源,然後當<input>中有輸入變化,即change事件後,會自動将輸入的内容,以GET方式發送到遠端資料源,其中輸入内容以term參數儲存;
例如,參數為http://remoteSource,那麼在使用者輸入abc後,将會發送一個GET請求如http://remoteSource?term=abc
傳回的結果必須以json格式,資料格式如上面1、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\":\"囧月\"}]");
- }
4、function參數,格式 Function( Object request, Function response( Object data ) )
這種參數最靈活,可以讓你以自己的方式向伺服器發出查詢,并自己解析資料,最後将資料回寫到response即可
- $ ( ".selector" ). autocomplete ({
- source: function(request,response){
- //擷取使用者輸入
- var term = request.term;
- //根據自定義方式從伺服器擷取資料
- ...
- //還可以自己解析資料
- ..
- //最後把資料按照前面1、2描述的格式,放到response中
- response(data);
- }
- });
一個例子:
- 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);//呈現結果
- }
- });
二 功能支援:
此自動補全功能,支援<input><textarea>或者有contenteditable 屬性的标簽
鍵盤操作:
1、上下鍵 可以選擇比對項
2、esc建 可以關閉比對菜單
3、enter建 可以選擇目前選中的比對項
4、pageup pagedown 可以操作比對菜單中的滾動條
CSS:
1、ui-autocomplete:比對菜單中比對項的css屬性
2、ui-autocomplete-input:輸入框的屬性
依賴:
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" target="_blank" rel="external nofollow" />
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
三 主要的事件
有一些事件,可用于在一些階段進行額外的控制:
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),則需要綁定一些事件來進行額外處理,具體可以參考 http://www.cnblogs.com/lwme/archive/2012/02/12/jquery-ui-autocomplete.html