jQuery autoComplete插件-实现自动匹配

最近要做一个搜索功能,为了更好的实现搜索,我们使用jquery autoComplete 插件实现自动补全功能。
首先要使用jquery autoComplete就要先下载 jquery AutoComplete 相关的包,本例子需要三个jar包,如下图所示 :
这里写图片描述

解决jquery不支持高版本的方法

例子是在 jquery 版本1.7.1 下使用的都没问题,但最近在我们的项目中jquery版本换成了 1.9 ,运行后发现不能实现自动补全功能了。后来在网上找了很多资料,才发现 juqery Autocomplete 插件依赖于jquery 1.2.6 到 jquery 1.8.3 的版本,对于jquery1.9 以上的版本不支持,1.9以上的版本去掉了 browser方法,所以要想在jquery1.9 版本以上继续使用 autocomplete 插件,通过实践我找到两种解决方法,这两种方法都可以用,具体如下:

1.   在autocomplete.js里面加代码

在autocomplete.js中,最上面增加  $.browser = navigator.userAgent; 即可.   如下图所示:


2. 利用 jquery 扩展性,创建一个 jquery-browser.js
可以利用的扩展性,创建一个高版本支持browser 的 JS,具体内容如下:

/*
* jQuery Autocomplete plugin 1.1
* Revision: $Id: jquery-browser.js 15 2015-08-22 10:30:27Z joern.zaefferer $
*/
jQuery.extend({ 
browser: function() 
{ 
var 
rwebkit = /(webkit)\/([\w.]+)/, 
ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, 
rmsie = /(msie) ([\w.]+)/, 
rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, 
browser = {}, 
ua = window.navigator.userAgent, 
browserMatch = uaMatch(ua); 

if (browserMatch.browser) { 
browser[browserMatch.browser] = true; 
browser.version = browserMatch.version; 
} 
return { browser: browser }; 
}, 
}); 

function uaMatch(ua) 
{ 
ua = ua.toLowerCase(); 

var match = rwebkit.exec(ua) 
|| ropera.exec(ua) 
|| rmsie.exec(ua) 
|| ua.indexOf("compatible") < 0 && rmozilla.exec(ua) 
|| []; 

return { 
browser : match[1] || "", 
version : match[2] || "0" 
}; 
}

 

本地json实现自动补全

<!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>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>自动补全功能</title>
<script type="text/javascript" src="jquery-1.7.1.min.js" ></script>
<script type="text/javascript" src="jquery.autocomplete.js"></script>
<link   rel="stylesheet" href="jquery.autocomplete.css"  />
<script  type="text/javascript">
    //本地数据<数组>
    var data =["java","javaee","jquery","c++","css","html","htm5","bb","ejb","c#"];

    //开始
    $().ready(function ()
    {
         $("#autoComplete").autocomplete(data,
        {
            minChars: 0,
            max: 5,
            autoFill: true,
            mustMatch: true,
            matchContains: true,
            formatItem: function (data, i, total) {
              return "<I>" + data[0] + "</I>";
            }, formatMatch: function (data, i, total) {
              return data[0];
            }, formatResult: function (data) {
              return data[0];
            }   

        });
    });


//搜索数据
       function onSearch()
       {
          var nickName =$("#autoComplete").val(); 
           alert(nickName);
       }
</script>
</head>

<body>
   <input  type="text" id="autoComplete" placeHolder="请输入要搜索的内容!"/>
   <input type="button" name="btnSearch" onclick="onSearch();" value="搜索"/>
</body>
</html>

后台读取数据实现自动补全

1.一次加载、多次使用:(这种方式是直接把后台查询到的所有数据一次性返回到浏览器,如果数据量很大的话,容易造成浏览器的栈溢出)

一次性获取到所有的城市信息:<input type="text" name="" id="allCity" onclick="$(this).click();"/>
    <input type="hidden" id="url_1" value='<c:url value="/"/>'/>

<script type="text/javascript">

    // 获取到全部的城市信息
    var url_ = $("#url_1").val();
    $(function(){
        $.ajax({
            url: url_+"/queryAllCityInfo",
            type: "post",
            dataType: "json",
            data:{},
            success: function(e){
                if(e.success){
                    $("#allCity").autocomplete(eval(e.data),{
                        max: 12,    //列表里的条目数
                        minChars: 0,    //自动完成激活之前填入的最小字符
                        width: 218,     //提示的宽度,溢出隐藏
                        scrollHeight: 300,   //提示的高度,溢出显示滚动条
                        matchContains: true,    //包含匹配,就是data参数里的数据,是否只要包含文本框里的数据就显示
                        autoFill: false,    //自动填充
                        formatItem: function(row, i, max) {
                            return row.name;
                        },
                        formatMatch: function(row, i, max) {
                            return row.name;
                        },
                        formatResult: function(row) {
                            return row.name;
                        }
                    }).result(function(event,item){

                    });
                }
            }
        });
    });
</script>

2.根据输入内容动态加载

前端js代码:

所处城市:<input type="text" name="searchStr" id="searchStr">
    <input type="hidden" id="url_" value='<c:url value="/queryCityName"/>'/>
<script type="text/javascript">
    var url = $("#url_").val();

    // 实时的更新列表中的条目信息
    $("#searchStr").autocomplete(url, {
        max : 8, // 列表里的条目数
        minChars : 0, // 自动完成激活之前填入的最小字符
        width : 200, // 提示的宽度,溢出隐藏
        matchContains : true, // 包含匹配,就是data参数里的数据,是否只要包含文本框里的数据就显示
        autoFill : false, // 自动填充
        cacheLength : 0, // 清除缓存 
        extraParams : {
            searchStr : function() {
                return $("#searchStr").val();
            }
        },
        parse : function(data) {
            var json = eval("("+data+")"); //一般返回的都是字符串,需要对其对象化
            if (json.success) {
                var parsed = [];
                var rows = json.nameList;               
                for (var i = 0; i < rows.length; i++) {
                    var name = rows[i].split("|"); // 使用Jquery中的autoComplete插件实现自动匹配功能时,直接使用它来解析json对象时,会出现一个错误提示,
                    //因为它默认使用"/n"拆分行、"|"拆分字段。如果需要使用它来解析json对象,则需要自己实现其parse方法。
                    parsed[parsed.length] = {
                        data : name, //下拉框显示数据格式
                        value : name, //选定后实际数据格式
                        result : name //选定后输入框显示数据格式
                    };
                }
                return parsed;
            }
        }
    }).result(function(event, item, data) { // 回调函数

         // data->相当于 value的值
    });
</script>

注:使用Jquery中的autoComplete插件实现自动匹配功能时,直接使用它来解析json对象时,会出现一个错误提示,因为它默认使用”/n”拆分行、”|”拆分字段。如果需要使用它来解析json对象,则需要自己实现其parse方法。

实例:

var data ; //定义数据
    //开始
    $.ajax({
        url: "${ctx}/nhProviderAction.do?method=getSuggestStage",
        type:"post",
        data:{"cityCode":"1"},
        success:function(result){
            var obj = eval('(' + result + ')');
            data = obj;
            autocompleteFn(data,".autoCom");
            $('#loading').hide();
        }
    });

        //自动 补全方法
        function autocompleteFn(data,obj) {
            $(obj).autocomplete(data,
                    {
                        minChars: 1,//在触发autoComplete前用户至少需要输入的字符数
                        //delay: 500,//击键后激活autoComplete的延迟时间(单位毫秒)
                        max: 10,//autoComplete下拉显示项目的个数,Default: 10
                        //autoFill: true,//要不要在用户选择时自动将用户当前鼠标所在的值填入到input框,Default: false
                        mustMatch: true,//如果设置为true,autoComplete只会允许匹配的结果出现在输入框,所有当用户输入的是非法字符时将会得不到下拉框,Default:false
                        matchContains: true,//决定比较时是否要在字符串内部查看匹配,如ba是否与foo bar中的ba匹配.使用缓存时比较重要.不要和autofill混用.Default: false
                        formatItem: function (data, i, total) {
                            return "<I>" + data.stageName + "</I>";
                    }, formatMatch: function (data, i, total) {
                            return data.stageName;
                    }, formatResult: function (data) {
                            return data.stageName
                        }
                    }).result(function (event, data, formatted) {// 这个是当选择某项时触发的回调函数
                        if(data == undefined){
                            $(this).closest('tr').find('input[name="sportManagerId"]').val('');
                            return;
                        }
                    //显示对应的案场经理
                        $(this).closest('tr').find('input[name="sportManagerId"]').val(data.sportManagerNames);
                        //放入stageid
                        $(this).closest('tr').find('input[name="stageId"]').val(data.stageId);
            });
        }

 实例:

$('#stageName').autocomplete({
        serviceUrl: '${ctx}/nhContractAction.do?method=getStageSuggest',
        type : 'post',
        dataType : 'json',
        width: 200,
        maxHeight: 250,
        noCache: true,
        transformResult: function(response) {
            $('#stageId').val('');
            $('#developerName').val('');
            
            if (response==null || response=='') {
                return {suggestions:[]};
            }
            return {
                suggestions: $.map(response, function(d) {
                    return { value: d.stageName, data: d.id, developerName: d.developerName };
                })
            };
        },
        onSelect: function (suggestion) {
            $('#stageId').val(suggestion.data);
            $('#developerName').val(suggestion.developerName);
        }
    });
<input type="text" id="stageName" name="stageName" value="${nhContract.stageName}" class="validate[required,maxSize[50]]" />

 

posted @ 2020-05-15 21:04  十月围城小童鞋  阅读(690)  评论(0编辑  收藏  举报