JQueryUI之Autocomplete

来源:http://www.cnblogs.com/shouce/archive/2016/04/07/5362041.html
-Advertisement-
Play Games

JQuery UI 是以 JQuery 為基礎的開源 JavaScript 網頁用戶界面代碼庫。包含底層用戶交互、動畫、特效和可更換主題的可視控制項,這些控制項主要包括:Accordion,Autocomplete,ColorPicker,Dialog,Slider,Tabs,DatePicker,Ma ...


  JQuery UI 是以 JQuery 為基礎的開源 JavaScript 網頁用戶界面代碼庫。包含底層用戶交互、動畫、特效和可更換主題的可視控制項,這些控制項主要包括:Accordion,Autocomplete,ColorPicker,Dialog,Slider,Tabs,DatePicker,Magnifier,ProgressBar,Spinner等,其中Autocomplete能夠非常容易的幫我們實現類似於百度搜索的智能提示功能。最新JQuery UI可以從JQuery UI官網下載獲得。
  一、首先瞭解下JQueryUI提供的重要屬性:
  1. autoFocus:當智能提示框出現時,是否自動選中第一項,預設為false,即不選中。
  2. delay:在按鍵後執行搜索的延時,預設為300ms。
       3. disabled:是否禁用自動完成功能,預設為false。
  4. minLength:觸發自動完成功能需要輸入的最小字元數量。
  5. source:即為指定智能提示下拉框中的數據來源,支持三種類型。
     Array,主要用於本地化數據提供,支持兩種格式:字元串數組 [ "Choice1", "Choice2" ]及標簽和值屬性的Json格式數組 [ { label: "Choice1", value: "value1" }, ... ]
      String,用於ajax請求的遠程地址鏈接,返回Array或Json格式字元串。
     Function,回調函數,最具有靈活性的一種方式,可用於返回任何數據源方式來實現自動完成,其中包含兩個參數requestresponse通過request.term 來獲取用戶輸入的值,通過response(argument)來對獲取的數據源進行顯示。
  二、JQuery UI還提供了一些有用的方法:
  1. close():關閉智能提示選擇框。  
  2. destroy():銷毀智能提示選擇框,將其所產生的元素完全刪除,使其恢復至初始狀態。
  3. disable():禁用自動完成功能。
  4. enable():開啟自動完成功能。
  三、主要事件包括:
  1. change(event, ui):當值改變時發生,ui.item為選中的項。
  2. close(event, ui):當智能提示框關閉時發生。

  3. create(event, ui):當智能提示框創建時發生,可以在此事件中,對外觀進行一些控制。
  4. focus(event, ui):當智能提示列表任意一項獲得焦點時發生,ui.item為獲得焦點的項。
  5. open(event, ui):當智能提示框打開或更新時發生。
  6. response(event,ui):在搜索完成後智能提示框顯示前發生,可以在此事件中對顯示項進行處理。

  7. search(event, ui): 在開始請求之前發生,可以在此事件中返回false來取消請求。
  8. select(event, ui):當智能提示框中任意一項被選中時發生,ui.item為選中的項。

複製代碼
<%@ Page Language="C#" AutoEventWireup="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Jquery UI Autocomplete</title>
<link rel="stylesheet" href="/themes/base/jquery.ui.all.css" />
<script type="text/javascript" src="/js/jquery-1.8.2.js"></script>
<script type="text/javascript" src="/js/jquery.ui.core.min.js"></script>
<script type="text/javascript" src="/js/jquery.ui.widget.min.js"></script>
<script type="text/javascript" src="/js/jquery.ui.position.min.js"></script>
<script type="text/javascript" src="/js/jquery.ui.menu.min.js"></script>
<script type="text/javascript" src="/js/jquery.ui.autocomplete.min.js"></script>
</head>
<body>
    <div style="margin:20px 50px;">
        <input id="txtSearchKey" type="text" class="text ui-widget-content ui-corner-all" style="width:250px; height:30px;" />
        <input id="btnSubmit" type="button" class="ui-button ui-widget ui-state-default ui-corner-all" value="搜索" />
    </div>
    <script type="text/javascript">
        $(function() {
            $("#txtSearchKey").autocomplete(
            {
                source: function(request, response) {
                    $.ajax({
                        url: "http://demo.com/ajax/Autocomplete.ashx",
                        dataType: "jsonp",
                        data: {
                            top: 10,
                            key: request.term
                        },
                        success: function(data) {
                            response($.map(data.citylist, function(item) {
                                return { label: item.city, value: item.city }
                            }));
                        }
                    });
                },
          select: function(event, ui) {
                    //提交搜索...
                }, minLength:
2, autoFocus: false, delay: 500 }); }); </script> </body> </html>
複製代碼

  上例中實現了向遠程域發送鏈接請求,需要將dataType設置為“jsopn”格式,或者通過$.getJSON函數亦可。response對json中所有數據項進行遍歷操作,返回每一項的名稱,值得註意的地方時,label表示智能提示框中的每一項顯示的文本,而value表示每一項的值,即選中該項後所賦值給搜索框的value。另外為了相同關鍵字的反覆發送搜索請求,我們還可加上本地緩存,其實就是用一個數組保存已經發送過請求的key和對應返回的data對象,所以也可以對以上js部分代碼修改如下:

複製代碼
<script type="text/javascript">
        $(function() {
            var cache = {};
            $("#txtSearchKey").autocomplete(
            {
                source: function(request, response) {
                    var term = request.term;
                    if (term in cache) {
                        data = cache[term];
                        response($.map(data.citylist, function(item) {
                            return { label: item.city, value: item.city }
                        }));
                    } else {
                        $.ajax({
                            url: "http://demo.com/ajax/Autocomplete.ashx",
                            dataType: "jsonp",
                            data: {
                                top: 10,
                                key: term
                            },
                            success: function(data) {
                                if (data.citylist.length) {
                                    cache[term] = data;
                                    response($.map(data.citylist, function(item) {
                                        return { label: item.city, value: item.city }
                                    }));
                                }
                            }
                        });
                    }
                },
                select: function(event, ui) {
                    //提交搜索...
                },
                minLength: 2,
                autoFocus: false,
                delay: 500
            });
        });
    </script>
複製代碼

  對應服務端程式如下:

複製代碼
using System;
using System.Web;
using AutoCompleteDemo.common;
using System.Collections.Generic;
using System.Text;

namespace AutoCompleteDemo.ajax
{
    public class Autocomplete : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            string key = TextHelper.DangerStringClear(RequestHelper.GetQueryString("key"));
            int top = RequestHelper.GetIntQueryString("top", 10);
            string callback = TextHelper.DangerStringClear(RequestHelper.GetQueryString("callback")) + "({\"citylist\":[";
            if (!string.IsNullOrEmpty(key))
            {
                City city = new City();
                Dictionary<int, string> diclist = city.GetCityName(key, top);
                if (diclist != null && diclist.Count > 0)
                {
                    StringBuilder sbJson = new StringBuilder(150);
                    foreach (KeyValuePair<int, string> item in diclist)
                    {
                        sbJson.Append("{\"id\":" + item.Key + ",\"city\":\"" + item.Value + "\"},");
                    }
                    callback += sbJson.ToString().Length > 0 ? sbJson.ToString().TrimEnd(',') : "";
                }
            }
            context.Response.Write(callback + "]})");
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}
複製代碼

  必須註意的是,在發送跨域請求時,會自動附加一個callback參數(如果是通過$.getJOSN則是jsoncallback)在輸出json數據時,必須將callback參數值輸出,否則將無法調用到回調函數。
  最後附上實現效果圖:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡介: 關於操作系統安裝方面的自動化,早前我們使用 RedHat 推出的 Kickstart 來批量安裝操作系統,近年來 RedHat 又推出一個 Cobbler 。 Cobbler 使用 Python 開發,小巧輕便,能夠完成系統安裝、甚至一些服務的管理。( 號稱是補鞋匠都能學會的工具 ) Cob ...
  • MVC:頁面提交的時候報如下錯誤: 解決方案: 這個Model 裡面定義了重覆的自多so~~~ ...
  • 在做整個類似QQ的畢業設計中,有一個小圖標把我給難了一陣子,就是托盤小圖標。 要完成的功能大約是,視窗選擇關閉時變成最小化到托盤圖標,雙擊托盤圖標顯示托盤圖標。 還是以登錄視窗為例子 要有托盤圖標首先需要一個notifyIcon,這個在工具箱中找。然後就是notifyic的相關屬性的設置了,首先需要 ...
  • ...
  • 在做3D漫游時,分別運用WASD和方向鍵,控制視角前後左右,KeyDown事件記錄漫游開始標記,但是WASD可以Debug進入,方向鍵卻始終無法進入,很奇怪的是,進不了KeyDown,卻能響應KeyUp事件 但是Ctrl+方向鍵和Alt+方向鍵卻可以進入,經過一番查找。很多文章中分析可能是因為方向鍵 ...
  • 一、前言 DependencyResolver是MVC中一個重要的組件,從名字可以看出,它負責依賴對象的解析,可以說它是MVC框架內部使用的一個IOC容 器。MVC內部很多對象的創建都是通過它完成的,或許我們平時沒有直接用到它,但是如果你在使用unity、autofac,或者在看一些開源項目時,總 ...
  • 創建二種方式 ...
  • 前言 建議13、為類型輸出格式化字元串 建議14、正確實現淺拷貝和深拷貝 建議15、使用dynamic來簡化反射實現 建議13、為類型輸出格式化字元串 有兩種方法可以為類型提供格式化的字元串輸出。 一種是意識到類型會產生格式化字元串輸出,於是讓類型繼承介面IFormattable。這對類型來說,是一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...