Bootstrap 在 3 之前提供了一個叫做 Typeahead 的元件,用途就是在輸入框中根據使用者目前的輸入,先到後台做查詢並且顯示可能的結果。不過這元件在 Bootstrap 3 被拿掉了,官方給的建議是改用 Twitter Typeahead。
Bootstrap Typeahead
Bootstrap Typeahead 要提供候選資料的方式有兩種,一是靜態資料,可以寫在 HTML 中如下:
<input type="text" class="span3" style="margin: 0 auto;" data-provide="typeahead" data-items="4" data-source='["Alabama","Alaska","Arizona"]'>
或者在 JavaScript 中指定:
$('.typeahead').typeahead({
source: ["Alabama","Alaska","Arizona"]
});
另一種方式則是從遠端載入,而遠端載入的時候可以決定要不要加搜尋參數,也就是說連接的資料可以是伺服器上的靜態 json 檔案,也可以是動態回應的搜尋結果。範例如下:
$('.ajax-typeahead').typeahead({
source: function(query, process) {
return $.ajax({
url: '/item/search.json',
type: 'get',
data: {
q: query
},
dataType: 'json',
success: function(json) {
if (typeof(json) === 'undefined' || json === null) {
return false;
} else {
return process(json.map(function(item) {
return item.title;
}));
}
}
});
}
});
如果想要看 CoffeeScript 版的:
$('.ajax-typeahead').typeahead {
source: (query, process) ->
$.ajax {
url: '/item/search.json',
type: 'get',
data: {q: query},
dataType: 'json',
success: (json) ->
if typeof json == 'undefined' || json == null then false else process(json.map (item) -> item.title)
}
}
老實說這用法有點複雜…
Twitter Typeahead
要換成 Twitter Typeahead 其實相當簡單,首先在網頁上匯入 typeahead.js
,接著一樣用 $('.ajax-typeahead').typeahead()
的方法呼叫,只是指定候選資料的方式不太一樣。Twitter Typeahead 指定候選資料的參數有三種:
local
:直接寫在網頁中,是個字串陣列prefetch
:遠端 Server 上的 JSON 檔remote
:Server query,預設的 query string token 是%QUERY
,可以用remote
自己的wildcard
這個 option 指定
這幾個參數的特點是可以混著用。你可以把最基本的幾個選項直接寫在 local
中,剩下靜態的資料用 prefetch
抓取,最後真的查不到的資料再到 remote
去查。範例(修改自Twitter 範例)如下:
$('input.typeahead-devs').typeahead({
name: 'accounts',
local: ['timtrueman', 'JakeHarding', 'vskarich'],
prefetch: 'https://twitter.com/network.json',
remote: 'https://twitter.com/accounts?q=%QUERY'
});
另外,Twitter Typeahead 可以提供多個資料集(dataset),只要將每個 dataset 放在陣列中傳入即可,官方範例寫得相當清楚:
$('.example-sports .typeahead').typeahead([
{
name: 'nba-teams',
prefetch: '../data/nba.json',
header: '<h3 class="league-name">NBA Teams</h3>'
},
{
name: 'nhl-teams',
prefetch: '../data/nhl.json',
header: '<h3 class="league-name">NHL Teams</h3>'
}
]);
Twitter Typeahead 還有些進階的應用,例如可以設計候選清單每個 cell 的樣式,除了直接將候選詞用 JSON 陣列回傳之外,也可以回傳 Twitter Typeahead 自己定義的 JSON 結構(Datum),以做到更精細的控制或呈現。
詳細文件可以參考