一、jquery.autocomplete.js插件的使用
1、获取后台数据
$("#scenic_name").flushCache(); //刷新缓存(非常重要) $('#scenic_name').autocomplete({ minChars: 0, '12.5%', matchCase:false,//不区分大小写 scroll: true, dataType: 'json', scrollHeight: 400, delay:100, matchContains: true,//是否只要包含文本框里的就可以 //此处为传递参数 extraParams: { prov_id: function() { return $("#prov_id").find("option:selected").val(); }, city_id: function() { return $("#city_id").find("option:selected").val(); }}, //需要把data转换成json数据格式 parse: function(json) { return $.map(eval(json.data), function(row) { return { data: row, value: row.name, //此处无需把全部列列出来,只是两个关键列 result: row.scenic_id } }); }, formatItem: function(data, i, total) { // 格式化列表中的条目;row:条目对象,i:当前条目数,total:总条目数 // 该条语句判断没有符合条件是数据时,将默认的undefined提示修改 if(data[0]== "No Records."){ return `<button data-id="${data.scenic_id}" disabled>暂无相关景区</button>`; }else{ return `<p data-id="${data.scenic_id}">${data.name}</p>`; } }, formatMatch: function(data, i, total) { return data.name; }, formatResult: function(data, value) { return data.name; } }).result(function(event, data, formatted) { //回调 $("#scenic_name").val(data.name); $("#scenic_id").val(data.scenic_id); // 选中时进行表单验证 $('#addTicketBaseForm').validate().element($("#scenic_name")) });
2、获取前台数据
var scenicArr= [{"scenic_id":"1001","name" : "北京长城"},{"scenic_id":"1002","name" : "故宫"}];
$('#scenic_name').autocomplete(scenicArr, {
minChars: 0,
'12.5%',
matchCase:false,//不区分大小写
scroll: true,
dataType: 'json',
scrollHeight: 400,
delay:100,
matchContains: true,//是否只要包含文本框里的就可以
formatItem: function(data, i, total) { // 格式化列表中的条目;row:条目对象,i:当前条目数,total:总条目数
if(data[0]== "No Records."){
return `<button data-id="${data.scenic_id}" disabled>暂无相关景区</button>`;
}else{
return `<p data-id="${data.scenic_id}">${data.name}</p>`;
}
},
formatMatch: function(data, i, total) {
return data.name;
},
formatResult: function(data, value) {
return data.name;
}}
).result(function(event, data, formatted) { //回调
$("#scenic_name").val(data.name);
$("#scenic_id").val(data.scenic_id);
// 选中时进行表单验证
$('#addTicketBaseForm').validate().element($("#scenic_name"))
});
插件的使用可参考以下这篇文章,里面也有很详细的参数说明:https://www.cnblogs.com/guo0/archive/2012/01/10/2318140.html
二、在使用该插件时遇到的问题:
1、第一次点击输入框不会出现下拉框,要点击两次或者按回退键才行。改成单击时触发的方法为:
将插件源码中的
if ( hasFocus++ > 1 && !select.visible() ) {
onChange(0, true);
}
改为
if ( ++hasFocus > 1 && !select.visible() ) {
onChange(0, true);
}
踩坑记录:
(1)minChars设置为0是默认双击触发插件
(2)给输入框添加 onclick="$(this).click();" 事件,结果进入死循环,网页崩了
2、