在項目中有一個要匹配輸入的股票代碼和行情代碼進行匹配的時候要用到自動完成功能,因而用了jQuery Autocomplete,可是在用的時候發現不能匹配出所須要的股票代碼,因而就查找Autocomplete的相關資料。可是發現從Ajax拿來的json數據,沒法正常解析。通常給個人解釋是要重寫parse方法。代碼以下:php
$(function() { function format(mail) { return mail.name + " <" + mail.to + ">"; } $("#email").autocomplete('ajax地址', { multiple: true, dataType: "json", parse: function(data) { return $.map(data, function(row) { return { data: row, value: row.name, result: row.name + " <" + row.to + ">" } }); }, formatItem: function(item) { return format(item); } }).result(function(e, item) { $("#content").append("<p>selected " + format(item) + "</p>"); }); });
因爲以前沒使用過Autocomplete,因此也不是很熟,也許是我比較笨,這樣用了以後仍是沒法解析返回的json數據。萬般無奈之下,我就改了插件裏面的方法。我是這樣作的。首先是發送請求:ajax
var addInput = $(".inputStock"); var optionsOne = { serviceUrl : "/privatelyfund/blurSearchStock_risk", minChars:2, params:{ authKey : authKey, stock_part : function(){ return addInput.val(); } }, dataType : 'JSON', maxHeight:200, width:212, zIndex:1000000, delimiter:/(,|;)\s*/, }; addInput.autocomplete(optionsOne);
在請求到返回的數據的時候會執行Autocomplete的processResponse方法,在這個函數裏面是對數據的處理,顯示的原理是把須要顯示的內容寫在suggestions這個數組裏面(在這裏輸入框裏面默認傳參是query,我沒用到這個參數,就把這句話註釋掉了,由於它會判斷返回的json裏面query字段)。在這裏我重寫了suggestions的值,把我須要自動提示的數據寫到suggestions數組裏面去,這樣就能夠作到自動提示,簡單粗暴。算法
processResponse: function(text) { var response; try { response = eval('(' + text + ')'); } catch (err) { return; } if (!$.isArray(response.data)) { response.data = []; } /*if(!this.options.noCache){ this.cachedResponse[response.query] = response; if (response.suggestions.length === 0) { this.badQueries.push(response.query); } }*/ /*if (response.query === this.getQuery(this.currentValue)) { this.suggestions = response.suggestions; this.data = response.data; this.suggest(); }*/ var result = JSON.parse(text).data.result; this.suggestions = []; this.data = []; if (result == undefined) { this.suggestions.push("沒有找到相關代碼"); }else{ for(var p in result){ this.suggestions.push(result[p]); this.data.push(p); } } this.suggest(); },
下面是Autocomplete數據庫
* minChars (Number):
在觸發autoComplete前用戶至少須要輸入的字符數.Default: 1,若是設爲0,在輸入框內雙擊或者刪除輸入框內內容時顯示列表
* width (Number):
指定下拉框的寬度. Default: input元素的寬度
* max (Number):
autoComplete下拉顯示項目的個數.Default: 10
* delay (Number):
擊鍵後激活autoComplete的延遲時間(單位毫秒).Default: 遠程爲400 本地10
* autoFill (Boolean):
要不要在用戶選擇時自動將用戶當前鼠標所在的值填入到input框. Default: false
* mustMatch (Booolean):
若是設置爲true,autoComplete只會容許匹配的結果出如今輸入框,全部當用戶輸入的是非法字符時將會得不到下拉框.Default: false
* matchContains (Boolean):
決定比較時是否要在字符串內部查看匹配,如ba是否與foo bar中的ba匹配.使用緩存時比較重要.不要和autofill混用.Default: false
* selectFirst (Boolean): 若是設置成true,在用戶鍵入tab或return鍵時autoComplete下拉列表的第一個值將被自動選擇,儘管它沒被手工選中(用鍵盤或鼠標).固然若是用戶選中某個項目,那麼就用用戶選中的值. Default: true
* cacheLength (Number):
緩存的長度.即對從數據庫中取到的結果集要緩存多少條記錄.設成1爲不緩存.Default: 10
* matchSubset (Boolean): autoComplete可不能夠使用對服務器查詢的緩存,若是緩存對foo的查詢結果,那麼若是用戶輸入foo就不須要再進行檢索了,直接使用緩存.一般是打開這個選項以減輕服務器的負擔以提升性能.只會在緩存長度大於1時有效.Default: true
* matchCase (Boolean):
比較是否開啓大小寫敏感開關.使用緩存時比較重要.若是你理解上一個選項,這個也就不難理解,就比如foot要不要到FOO的緩存中去找.Default: false
* multiple (Boolean):
是否容許輸入多個值即屢次使用autoComplete以輸入多個值. Default: false
* multipleSeparator (String):
若是是多選時,用來分開各個選擇的字符. Default: ","
* scroll (Boolean):
當結果集大於默認高度時是否使用卷軸顯示 Default: true
* scrollHeight (Number):
自動完成提示的卷軸高度用像素大小表示 Default: 180
* formatItem (Function):
爲每一個要顯示的項目使用高級標籤.即對結果中的每一行都會調用這個函數,返回值將用LI元素包含顯示在下拉列表中. Autocompleter會提供三個參數(row, i, max): 返回的結果數組, 當前處理的行數(即第幾個項目,是從1開始的天然數), 當前結果數組元素的個數即項目的個數. Default: none, 表示不指定自定義的處理函數,這樣下拉列表中的每一行只包含一個值.
* formatResult (Function):
和formatItem相似,但能夠將將要輸入到input文本框內的值進行格式化.一樣有三個參數,和formatItem同樣.Default: none,表示要麼是隻有數據,要麼是使用formatItem提供的值.
* formatMatch (Function):
對每一行數據使用此函數格式化須要查詢的數據格式. 返回值是給內部搜索算法使用的. 參數值row
* extraParams (Object):
爲後臺(通常是服務端的腳本)提供更多的參數.和一般的做法同樣是使用一個鍵值對對象.若是傳過去的值是{ bar:4 },將會被autocompleter解析成my_autocomplete_backend.php?q=foo&bar=4 (假設當前用戶輸入了foo). Default: {}
* result (handler) Returns: jQuery
此事件會在用戶選中某一項後觸發,參數爲:
event: 事件對象. event.type爲result.
data: 選中的數據行.
formatted:formatResult函數返回的值
例如:
$("#singleBirdRemote").result(function(event, data, formatted) {
//如選擇後給其餘控件賦值,觸發別的事件等等
});json
formatItem、formatMatch、formatResult是自定提示信息的關鍵。數組
formatItem做用在於能夠格式化列表中的條目,好比咱們加了「I」,讓列表裏的字顯示出了斜體。緩存
formatMatch是配合formatItem使用,做用在於,因爲使用了formatItem,因此條目中的內容有所改變,而咱們要匹配的是原始的數據,因此用formatMatch作一個調整,使之匹配原始數據,服務器
formatResult是定義最終返回的數據,好比咱們仍是要返回原始數據,而不是formatItem過的數據。app