返回列表 發帖

[jQuery] Autocomplete - 自動完成文字輸入

jQuery Autocomplete
http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/
輕鬆擁有自動完成的文字輸入框

使用方式

下載 jQuery Autocomplete 後,將 js 和 css 引用進來。
<link rel="stylesheet" type="text/css" href="jquery.autocomplete.css" />  
<script type="text/javascript" src="jquery-1.2.6.pack.js"></script>
<script type="text/javascript" src="jquery.autocomplete.js"></script>

使用靜態資料的範例

這個 plugin 有兩種使用(取得)資料的方式,一種是直接使用 javascript array 的資料來做 autocomplete,另一種是使用 AJAX 去 server 端要資料。先看第一種方式的作法:
<input type="text" name="t1" id="t1" />
這是一個普通的文字輸入框,假設這是要給 user 輸入行政區的欄位,現有的資料已存在於 javascript 的程式中,可以再加入以下程式來達到 autocomplete 的功能:
  var data = ['台北市中正區','台北市大同區','台北市中山區','台北市松山區','台北市大安區'];
  $("#t1").autocomplete(data, {matchContains: true});
很簡單吧!試試看效果:




使用 AJAX 取得資料的範例

另一種方式是資料存放於 server 端,由 client 端即時向 server 端取得,適合資料量比較大的時候的處理方式。程式也相當簡單,原本指定的資料來源改為 server 端的一隻程式即可:
$("#t2").autocomplete('autocomplete.php');
client 端會將 user 輸入的值以 q 這個變數傳入,server 端只需要把資料以斷行隔開輸出即可,以下是一段 PHP 的範例:
<?php
$q = $_GET["q"];
if (!$q) return;
$data = array('台北市中正區','台北市大同區','台北市中山區','台北市松山區','台北市大安區');
foreach ($data as $value) {
  if (strpos($value, $q) !== false) {
    echo $value."\n";
  }
}
?>
To infinity and beyond!

一般來說我會放到網頁的最後面,例如:
<html>
<body>
...
...
...
<script type="text/javascript">
$(function() {
  var data = ['台北市中正區','台北市大同區','台北市中山區','台北市松山區','台北市大安區'];   
  $("#t1").autocomplete(data, {matchContains: true});    
});
</script>
</body>
</html>
To infinity and beyond!

TOP

有試過直接在瀏覽器輸入 supply_list.aspx?q=a 試試看嗎?

不知道是不是換行的問題:
Response.Write(data(i) & "\n")
To infinity and beyond!

TOP

反應速度指的是輸入後,不會馬上出現下拉選單嗎?

有兩個因素影響下拉選單出現的速度,一個是透過參數 delay 來控制按鍵後的反應,預設是 400 msec (0.4 秒) ,您可以參考一下。不過由於透過網路傳輸資料,反應速度調太快未必會有幫助喔。delay 的設定值可由第二個參數傳入,例如:
$("#t2").autocomplete('supply_list.aspx', {delay: 100});  
另一個因素則是伺服器回傳的速度,不知道伺服器或網路的速度是否都正常呢?

至於「選項沒有這麼多個,他的下拉式選單卻還是很多」,不知道是什麼意思呢?
瀏覽器內輸入 supply_list.aspx?q=a  時的輸出項目都正常嗎?
To infinity and beyond!

TOP

我看了一下官方的 demo 頁面有類似的
http://jquery.bassistance.de/autocomplete/demo/

可參考 E-Mail (local) 那一欄的作法:
$("#suggest13").autocomplete(emails, {
  minChars: 0,
  width: 310,
  matchContains: true,
  autoFill: false,
  formatItem: function(row, i, max) {
    return i + "/" + max + ": \"" + row.name + "\" [" + row.to + "]";
  },
  formatMatch: function(row, i, max) {
    return row.name + " " + row.to;
  },
  formatResult: function(row) {
    return row.to;
  }
});
To infinity and beyond!

TOP

呈現的方式應該可以在 formatItem 這邊處理,要讓值靠左、結果靠右就寫在這裡面。
To infinity and beyond!

TOP

歡迎常來逛逛
To infinity and beyond!

TOP

原帖由 terry.lin 於 2009-2-4 17:26 發表
可以幫忙看一下嗎?我的都沒有反應,也沒有錯誤訊息,是怎麼了?


你的程式可能要注意:
1. jQuery 有重複引用了, 只需要引用一次即可
2. autocomplete 這個 js 檔是否存在

其他的部份看起來沒有問題喔
To infinity and beyond!

TOP

原帖由 liaoost 於 2009-2-4 11:52 發表
請問在上面的例子中有用ASP.NET 的作法實現"自動完成文字輸入"
我在"Default4.aspx"網頁中 區段寫入下面代碼.


你要用這段 javascript 的話,得先引用 jquery 和 autocompelete 兩個 js,另外還有一個 css。
引用之後,這一段 javascript 則要等到整個 page load 進來後才能去呼叫。
你可以參考你那篇 post 底下的另一篇,那一篇裡面就有一個完整的範例。
若是對 jQuery 還不太熟悉的話,可以參考[jQuery 教學 - 基礎篇]的說明。

都完成之後呢,就可以再繼續 server 端的部份,如果你要在同一隻 aspx 內使用的話,就得改用帶參數的方式進去,並且把程式寫在 Page_Load() 裡面。

.aspx 要改成這樣:
$("#t1").autocomplete('Default4.aspx?doQuery=1');
.vb 內會有這樣一段:
Sub Page_Load()
  If Request("doQuery") = "1" Then
    '這邊就用一個選項換一行的方式輸出資料吧
  End If
  Response.End()
End Sub
大致如上,請試試看吧
To infinity and beyond!

TOP

你那一頁基本上都是純 client 端的程式,與 server 完全無關喔。

會不會是少了某個檔案造成的?
To infinity and beyond!

TOP

返回列表 回復 發帖