jquery AutoComplete 兼容汉字首字母 MVC2进行查询

本文主要涉及了三方面的技术,在google上找到的技术资料进行整合。下面是用到的博客文章

 

//jQuery autocomplete 插件进行自定义方法进行查询

http://www.cnblogs.com/eflylab/archive/2009/09/18/1569043.html

 

//获得汉字首字母的博客

 

 

在此表示对作者表示歉意,忘记了。时间紧。先写完以后找到再添加。希望大家也帮我找找然后添加上来

 

 

 

1、jQuery autocomplete插件自定义方法进行查询

 

 

下面是在上面的博客上找到的资料

 

 

<script type="text/javascript">
var stockInfoJson = [
{ name: "深发展A", code: "000001",spell:"sfza" },
{ name: "万科A", code: "000002",spell:"wka"},
{ name: "ST 国 农", code: "000004",spell:"stgn" },
{ name: "世纪星源", code: "000005",spell:"sjxy" },
{ name: "深振业A", code: "000006" ,spell:"szya"},
{ name: "ST 达 声", code: "000007" ,spell:"stds"},
{ name: "ST宝利来", code: "000008" ,spell:"stbll"},
{ name: "中国宝安", code: "000009" ,spell:"zgba"},
{ name: "S ST华新", code: "000010" ,spell:"ssthx"},
{ name: "山航B", code: "200152" ,spell:"shb"},
{ name: "*ST帝贤B", code: "200160" ,spell:"stdxb"},
{ name: "雷伊B", code: "200168" ,spell:"lyb"},
{ name: "宝石B", code: "200413",spell:"bsb" },
{ name: "小天鹅B", code: "200418" ,spell:"xteb"},
{ name: "粤高速B", code: "200429" ,spell:"agsb"},
{ name: "宁通信B", code: "200468" ,spell:"ltxb"},
{ name: "晨鸣B", code: "200488" ,spell:"cmb"},
{ name: "珠江B", code: "200505" ,spell:"zjb"},
{ name: "闽灿坤B", code: "200512" ,spell:"mskb"},
{ name: "华电国际", code: "600027" ,spell:"hdgj"}
];

$(function(){
$("#suggest1").autocomplete(stockInfoJson, {
minChars:0,
matchCase:false,//不区分大小写
autoFill: false,
max: 10,
formatItem: function(row, i, max,term) {
var v = $("#suggest1").val();
return row.name + " (" + row.code + ")";
},

formatResult: function(row) {
return row.code;
},
resultSearch:function(row,v)//本场数据自定义查询语法 注意这是我自己新加的事件
{
//自定义在code或spell中匹配
if(row.data.code.indexOf(v) == 0 || row.data.spell.indexOf(v) == 0)
{
return row;
}
else
return false;
}
});
});

</script>
<body>
<h1>jquery.autocomplete.js 扩展自定义查询方法</h1>
<p>
楚旋--博客园<a href='http://eflylab.cnblogs.com' target='_blank'>http://eflylab.cnblogs.com</a> 本文链接
<a href='http://www.cnblogs.com/eflylab/archive/2009/09/18/1569043.html' target='_blank'>jquery.autocomplete.js 插件的自定义搜索规则</a>
</p>
<p>
<label>StockInfo(local):</label>
<input type="text" id="suggest1" />
</p>

</body>

</html>

 

但是我使用的时候遇到了问题,不好用(不是他这种方法不好用).

 

 

我的项目是MVC2 + JQuery 1.4.4 + JQuery Autocomplete

 

 

AutoComplete原作者的数据是在脚本中定义的数组,但是我的是MVC2的控制器返回的Json,因此出现了问题。

 

 

MVC2中的代码,很简单

 

 

public ActionResult GetEntireModels()
{
List<Automonitor.Models.Entity.Station> lst = bll.GetNameList();
return Json(lst, JsonRequestBehavior.AllowGet);
}

 

我的客户端写法


  $("#stationNames").autocomplete(“/Station/GetEntireModels", {
minChars: 0,
matchCase: false,
autoFill: false,
delay: 10,
max: 10,
formatItem: function(row, i, max, term) {
return row.S_Name;
},
formatResult: function(row) {
return row.S_No;
},
resultSearch: function(row, v) {
var firstPY = getStringFirstChar(row.data.S_Name);
if (row.data.S_Name.indexOf(v) == 0 || firstPY.indexOf(v) == 0) {
return row;
}
else
return false;
}
});

//此时出现问题,jquery.autocomplete.js中的函数parse出现错误

 

 

查找资料 和 插件自带的demo修改为如下写法

  $("#stationNames").autocomplete(“/Station/GetEntireModels", {
minChars: 0,
matchCase: false,
autoFill: false,
delay: 10,
max: 10,
formatItem: function(row, i, max, term) {
return row.S_Name;
},


parse: function(data) {
return $.map(data, function(row) {
return {
data: row,
  value: row.S_Name,
  result: row.S_No
}
});
}
   ,
resultSearch: function(row, v) {
var firstPY = getStringFirstChar(row.data.S_Name);
if (row.data.S_Name.indexOf(v) == 0 || firstPY.indexOf(v) == 0) {
return row;
}
else
return false;
}
});

此时的现象,不过滤。即无论输入什么都显示全部的数据。显示全部数据正常

网上也有下面的修改方法但是还是不好用

parse: function(data) {

var rows[];

 

 

for(var i = 0; i < data.length; i++){

 

rows[rows.length] = {

 

data:data[i]...

....

}

}

}

类似的代码,我经过测试还是原先原先的现象(不过滤。即无论输入什么都显示全部的数据。显示全部数据正常)

后来又查了资料在jQuery Autocomplete的官方网站上发现了一小段文字

$.getJSON....

很受启发,立即测试一切OK!

下面是正确的代码,贴出来

$.getJSON("/Station/GetEntireModels", null, function(data) {
$("#stationNames").autocomplete(data, {
minChars: 0,
matchCase: false,
autoFill: false,
delay: 10,
max: 10,
formatItem: function(row, i, max, term) {
return row.S_Name;
},
formatResult: function(row) {
return row.S_No;
},
resultSearch: function(row, v) {
var firstPY = getStringFirstChar(row.data.S_Name);
if (row.data.S_Name.indexOf(v) == 0 || firstPY.indexOf(v) == 0) {
return row;
}
else
return false;
}
});
});

这样在输入的时候就可以兼容拼音首字母了。

 

 

例如:八一,我输入b也可以找到此项

这就是我的经验笔记!希望大家多多指正。

 

 

本文还有为解决的问题,拼音字首字母的问题。现在代码存在多音字的问题。

即:重庆,应该是cq, 由于重是多音字现在的代码将它将解析成zq,请大家多多指教这方面的问题。

 

 

遗留问题:使用javascript如何获得多音字的首字母

 

另外对于.net的用户可以使用ChnCharInfo的类库来获得汉字的拼音,当然了首字母更能获得了。另外他可以返回这个字的所有拼音也就是

兼容多音字。 但是我认为每次都ajax调用MVC2的控制器来返回他的首字母,影响性能。所以不推荐。这个库不但能返回拼音还能返回笔画

和声调,很强大要是在.net中应用很好的!

vsintlpack1.zip

下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyID=44cac7f0-633b-477d-aed2-99aee642fc10&DisplayLang=zh-cn

简单的使用方法:

 

 

ChineseChar sss = new ChineseChar('中');

StringBuilder sbzzm = new StringBuilder();

  foreach (string pin in sss.Pinyins) //所有的音,通过调试发现最多是8个音
{
  sbzzm.Append(pin); //没有音pin=null
}

MessageBox.Show(sbzzm.ToString());

 

 

 

项目中有一个城市导航,导航上有一个城市搜索,即用户输入城市名、或拼音即可有匹配的提示,方便用户选择。于是乎下载了一个jquery.autocomplete-1.1.3,但引用到项目后,发现几个问题,并相应做了修改: 1.中文输入后,服务端不能正常获取ajax提交的数据(此处,当然可以用相应转码,本人试了n种方便仍改),细看代码发现, 是用 $.get(this.serviceUrl, me.options.params, function(txt) { me.processResponse(txt); }, 'text'); 提交的, 于是改成了我熟悉的提交方式。 $.ajax({url:this.serviceUrl,data:"query="+me.options.params.query,timeout: 5000,success: function(o){me.processResponse(o);}}); 问题立即解决。 猜想,是默认utf-8编码与我服务端过滤器中转码以及代码的转码发生了冲突。 2.当输入框值发生变化时,onchange事件不灵敏。 于是,添加了一个函数,输入值一但onchange就调用 。 onKeyProcessDefult: function(i) { var me, fn, s, d; me = this; s = me.suggestions[i]; d = me.data[i]; if(this.currentValue!=s || undefined==d){d="";s="";} this.selectedIndex=0; //输入时,一但有匹配的项,就默认选择第一项,这样,再按回车键,即可直接submit提交 jht添加 2011-07-20 $(".auto_selected_val").val(d); } 3. 当输入正确值,而不去选择相应提示项时,按回车键,不能完成自动提交。另外就是,当输入正确值,而不去选择相应提示项进,点击后面的提交按钮,也不能完成提交。(赶集网的城市切换也有这个小瑕疵哦)。 于是修改为,一但输入后只有可匹配的项时,就默认选中第一项(代码如上)。 这样,再提交就不是问题了。 4.输入值,当没有相应匹配项时,没有任何提示,不友好,影响用户体验。 5.服务服端注意返回json格式参数格试哦{ query:'c',suggestions:['北京','保定','包头','本溪'],data:['hr','cu','cy','cz'] } 项目应用实例:http://www.juyuan.com/members/city 参考实案例:http://www.ganji.com/index.htm
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值