js 文本框自动补全功能,异步加载数据,调试成功的
2016-12-08 17:46
417 查看
前台:
var maxcount = 0;// 表示他最大的值
var thisCount =0;// 初始化他框的位置
var flagThis = 0;
var flag = 0; //标示是否选择自动补全
var zdbqid;
$(function(){
$("body").prepend("<div style='width:120px; display:none; background:#FFFFFF; position: absolute;z-index:9999' id='autoTxt'></div>");
//键盘按键移动事件上键38,下键40,确定键13
$("body").keyup(function(even){
var id = zdbqid+"_txt";
var v = even.which;
if(38==v){//上键
if(thisCount>0){
--thisCount;
}else{
thisCount = maxcount-1;
}
$("#autoTxt li").css("background", "#FFFFFF");
$("#autoTxt li:eq("+thisCount+")").css("background", "#3b5998");
}else if(40==v){//下键
if(thisCount<maxcount-1){
++thisCount;
}else{
thisCount = 0;
}
$("#autoTxt li").css("background", "#FFFFFF");
$("#autoTxt li:eq("+thisCount+")").css("background", "#3b5998");
}else if(8==v){//删除键BackSpace BackSpace
var text = $("#"+id).val();
var title = $("#"+id).attr("title");
if(text && text.length>0){
var lastChar = text.substring(text.length-1,text.length);
if(lastChar=="," || lastChar=="," || lastChar=="、"){
text = text.substring(0,text.length-1);
}
if(text.length < title.length){//去掉不完整对象
var comp = $("#"+id).attr("comp");
var compobj,compvalue,comptxt;
if(comp && comp!=""){
compobj = eval("({"+comp+"})");
compvalue = compobj.value;
comptxt = compobj.text;
}
compobj.value = compvalue.substring(0,compvalue.lastIndexOf(","));
compobj.text = comptxt.substring(0,comptxt.lastIndexOf("、"));
$("#"+id).attr("title",compobj.text);
$("#"+zdbqid).val(compobj.value);//放入id
comp = JSON.stringify(compobj);
$("#"+id).attr("comp",comp.substring(1,comp.length-1));
}
}
}else if(13==v){//确定键
flag = 1; //标示是否选择自动补全
var jgname=$("#"+thisCount).text();//获取名称
var fid = $("#autoTxt span:eq("+thisCount+")").text();//获取id
//判断选择是多选还是唯一选择
var isMultiple = false;//是否进行多值多次匹配
var comp = $("#"+id).attr("comp");
var compobj,compvalue,comptxt;
if(comp && comp!=""){
compobj = eval("({"+comp+"})");
if(compobj.maxSize && parseInt(compobj.maxSize) > 1){
isMultiple = true;
}
compvalue = compobj.value;
comptxt = compobj.text;
}
if(isMultiple && compvalue){
if(compvalue.indexOf(""+fid) <0){
compobj.value = (compvalue && compvalue.length>0)?compvalue+","+fid:fid;
compobj.text = (comptxt && comptxt.length>0)?comptxt+"、"+jgname:jgname;
}
}else{
compobj.value = fid;
compobj.text = jgname;
}
if(compobj.text!=""){
$("#"+id).val(compobj.text);//放入名称
$("#"+id).attr("title",compobj.text);
}
if(compobj.value!=""){
$("#"+zdbqid).val(compobj.value);//放入id
}
comp = JSON.stringify(compobj);
$("#"+id).attr("comp",comp.substring(1,comp.length-1));
$("#autoTxt").html("");
$("#autoTxt").hide();
}else {
if($("#autoTxt").html()!=""){
thisCount=0;
}
}
}
);
});
function obtainInfo(key,type,even){
zdbqid = key;
var id = key+"_txt";
//div的宽度更控件宽度一样
document.getElementById("autoTxt").style.width= document.getElementById(""+id).style.width;
var v = even.which;
//回车键:13;上键38;下键40// 当点击上下键或者确定键时阻止他传送数据
if (v == 38 || v == 40 || v == 13){
return;
}
var txt = $("#"+id).val();//这里是取得他的输入框的值
txt = txt.replace("/^\n+|\n+$/g","");//去掉末尾的空格换行
//判断选择是多选还是唯一选择
var isMultiple = false;//是否进行多值多次匹配
var comp = $("#"+id).attr("comp");
var compobj,compvalue,comptxt;
if(comp && comp!=""){
compobj = eval("({"+comp+"})");
if(compobj.maxSize && parseInt(compobj.maxSize) > 1){
isMultiple = true;
}
compvalue = compobj.value;
comptxt = compobj.text;
}
var oldTxt = txt;
txt = checkIllegalChar(txt);
var arr = txt.split("、");
if(isMultiple && arr.length > 1){
txt= arr[arr.length-1];
}else if(arr.length > 1){
alert("只能输入一个");
return false;
}
if (txt != "") {
$.ajax({
url : "/collaboration.do?method=autocompleter&type="+type+"&textValue="+encodeURIComponent(encodeURIComponent(txt)),//从后台取得json数据
success : function(data) {
if(data.length <=0) return;
var arr = data.split(",");
maxcount = arr.length;
flagThis = 1;
var offset = $("#"+id).offset();//offset() 方法返回或设置匹配元素相对于文档的偏移(位置)。
$("#autoTxt").show();
$("#autoTxt").css("top", (offset.top + 22) + "px");
$("#autoTxt").css("left", offset.left + "px");
var Candidate = "";
for(var i=0;i<arr.length;i++){
var nn=arr[i].split("#@#");
Candidate += "<li style='list-style:none' id='"+i+"'>"+nn[0]+"</li><span id='hhh' style=display:none >"+nn[1]+"</span>";
}
$("#autoTxt").html(Candidate);
$("#autoTxt li:eq(0)").css("background", "#3b5998");//初始化默认选择第一个数据
//当单击某个LI时反映
$("#autoTxt li").click(function(){
flag = 1;//标示是否选择自动补全
var jgname=$("#autoTxt li:eq("+this.id+")").text();//获取名称
var fid = $("#autoTxt span:eq("+thisCount+")").text();//获取id
if(isMultiple && compvalue){
if(compvalue.indexOf(""+fid) <0){
compobj.value = (compvalue && compvalue.length>0)?compvalue+","+fid:fid;
compobj.text = (comptxt && comptxt.length>0)?comptxt+"、"+jgname:jgname;
}
}else{
compobj.value = fid;
compobj.text = jgname;
}
comp = JSON.stringify(compobj);
$("#"+id).attr("comp",comp.substring(1,comp.length-1));
$("#"+id).attr("title",compobj.text);
$("#"+id).val(compobj.text);//放入名称
$("#"+key).val(compobj.value);//放入id
$("#autoTxt").html("");
$("#autoTxt").hide();
});
//移动对象
$("#autoTxt li").hover(function(){
$("#autoTxt li").css("background", "#FFFFFF");
$("#autoTxt li:eq("+this.id+")").css("background", "#3b5998");
thisCount=this.id;
},function(){
$("#autoTxt li").css("background", "#FFFFFF");
});
}
});
}else{
$("#autoTxt").html("");
$("#autoTxt").hide();
maxcount = 0;
}
}
/**
* 将输入的多信息字符串特殊字符换成“、”
*
* @param obj
* @return
*/
function checkIllegalChar(val) {
if (val) {
val =val.replace(/,/g,'、');
val =val.replace(/,/g,'、');
}
return val;
}
后台传出的字符串格式为:名称#@#类型|id,名称#@#类型|id
var maxcount = 0;// 表示他最大的值
var thisCount =0;// 初始化他框的位置
var flagThis = 0;
var flag = 0; //标示是否选择自动补全
var zdbqid;
$(function(){
$("body").prepend("<div style='width:120px; display:none; background:#FFFFFF; position: absolute;z-index:9999' id='autoTxt'></div>");
//键盘按键移动事件上键38,下键40,确定键13
$("body").keyup(function(even){
var id = zdbqid+"_txt";
var v = even.which;
if(38==v){//上键
if(thisCount>0){
--thisCount;
}else{
thisCount = maxcount-1;
}
$("#autoTxt li").css("background", "#FFFFFF");
$("#autoTxt li:eq("+thisCount+")").css("background", "#3b5998");
}else if(40==v){//下键
if(thisCount<maxcount-1){
++thisCount;
}else{
thisCount = 0;
}
$("#autoTxt li").css("background", "#FFFFFF");
$("#autoTxt li:eq("+thisCount+")").css("background", "#3b5998");
}else if(8==v){//删除键BackSpace BackSpace
var text = $("#"+id).val();
var title = $("#"+id).attr("title");
if(text && text.length>0){
var lastChar = text.substring(text.length-1,text.length);
if(lastChar=="," || lastChar=="," || lastChar=="、"){
text = text.substring(0,text.length-1);
}
if(text.length < title.length){//去掉不完整对象
var comp = $("#"+id).attr("comp");
var compobj,compvalue,comptxt;
if(comp && comp!=""){
compobj = eval("({"+comp+"})");
compvalue = compobj.value;
comptxt = compobj.text;
}
compobj.value = compvalue.substring(0,compvalue.lastIndexOf(","));
compobj.text = comptxt.substring(0,comptxt.lastIndexOf("、"));
$("#"+id).attr("title",compobj.text);
$("#"+zdbqid).val(compobj.value);//放入id
comp = JSON.stringify(compobj);
$("#"+id).attr("comp",comp.substring(1,comp.length-1));
}
}
}else if(13==v){//确定键
flag = 1; //标示是否选择自动补全
var jgname=$("#"+thisCount).text();//获取名称
var fid = $("#autoTxt span:eq("+thisCount+")").text();//获取id
//判断选择是多选还是唯一选择
var isMultiple = false;//是否进行多值多次匹配
var comp = $("#"+id).attr("comp");
var compobj,compvalue,comptxt;
if(comp && comp!=""){
compobj = eval("({"+comp+"})");
if(compobj.maxSize && parseInt(compobj.maxSize) > 1){
isMultiple = true;
}
compvalue = compobj.value;
comptxt = compobj.text;
}
if(isMultiple && compvalue){
if(compvalue.indexOf(""+fid) <0){
compobj.value = (compvalue && compvalue.length>0)?compvalue+","+fid:fid;
compobj.text = (comptxt && comptxt.length>0)?comptxt+"、"+jgname:jgname;
}
}else{
compobj.value = fid;
compobj.text = jgname;
}
if(compobj.text!=""){
$("#"+id).val(compobj.text);//放入名称
$("#"+id).attr("title",compobj.text);
}
if(compobj.value!=""){
$("#"+zdbqid).val(compobj.value);//放入id
}
comp = JSON.stringify(compobj);
$("#"+id).attr("comp",comp.substring(1,comp.length-1));
$("#autoTxt").html("");
$("#autoTxt").hide();
}else {
if($("#autoTxt").html()!=""){
thisCount=0;
}
}
}
);
});
function obtainInfo(key,type,even){
zdbqid = key;
var id = key+"_txt";
//div的宽度更控件宽度一样
document.getElementById("autoTxt").style.width= document.getElementById(""+id).style.width;
var v = even.which;
//回车键:13;上键38;下键40// 当点击上下键或者确定键时阻止他传送数据
if (v == 38 || v == 40 || v == 13){
return;
}
var txt = $("#"+id).val();//这里是取得他的输入框的值
txt = txt.replace("/^\n+|\n+$/g","");//去掉末尾的空格换行
//判断选择是多选还是唯一选择
var isMultiple = false;//是否进行多值多次匹配
var comp = $("#"+id).attr("comp");
var compobj,compvalue,comptxt;
if(comp && comp!=""){
compobj = eval("({"+comp+"})");
if(compobj.maxSize && parseInt(compobj.maxSize) > 1){
isMultiple = true;
}
compvalue = compobj.value;
comptxt = compobj.text;
}
var oldTxt = txt;
txt = checkIllegalChar(txt);
var arr = txt.split("、");
if(isMultiple && arr.length > 1){
txt= arr[arr.length-1];
}else if(arr.length > 1){
alert("只能输入一个");
return false;
}
if (txt != "") {
$.ajax({
url : "/collaboration.do?method=autocompleter&type="+type+"&textValue="+encodeURIComponent(encodeURIComponent(txt)),//从后台取得json数据
success : function(data) {
if(data.length <=0) return;
var arr = data.split(",");
maxcount = arr.length;
flagThis = 1;
var offset = $("#"+id).offset();//offset() 方法返回或设置匹配元素相对于文档的偏移(位置)。
$("#autoTxt").show();
$("#autoTxt").css("top", (offset.top + 22) + "px");
$("#autoTxt").css("left", offset.left + "px");
var Candidate = "";
for(var i=0;i<arr.length;i++){
var nn=arr[i].split("#@#");
Candidate += "<li style='list-style:none' id='"+i+"'>"+nn[0]+"</li><span id='hhh' style=display:none >"+nn[1]+"</span>";
}
$("#autoTxt").html(Candidate);
$("#autoTxt li:eq(0)").css("background", "#3b5998");//初始化默认选择第一个数据
//当单击某个LI时反映
$("#autoTxt li").click(function(){
flag = 1;//标示是否选择自动补全
var jgname=$("#autoTxt li:eq("+this.id+")").text();//获取名称
var fid = $("#autoTxt span:eq("+thisCount+")").text();//获取id
if(isMultiple && compvalue){
if(compvalue.indexOf(""+fid) <0){
compobj.value = (compvalue && compvalue.length>0)?compvalue+","+fid:fid;
compobj.text = (comptxt && comptxt.length>0)?comptxt+"、"+jgname:jgname;
}
}else{
compobj.value = fid;
compobj.text = jgname;
}
comp = JSON.stringify(compobj);
$("#"+id).attr("comp",comp.substring(1,comp.length-1));
$("#"+id).attr("title",compobj.text);
$("#"+id).val(compobj.text);//放入名称
$("#"+key).val(compobj.value);//放入id
$("#autoTxt").html("");
$("#autoTxt").hide();
});
//移动对象
$("#autoTxt li").hover(function(){
$("#autoTxt li").css("background", "#FFFFFF");
$("#autoTxt li:eq("+this.id+")").css("background", "#3b5998");
thisCount=this.id;
},function(){
$("#autoTxt li").css("background", "#FFFFFF");
});
}
});
}else{
$("#autoTxt").html("");
$("#autoTxt").hide();
maxcount = 0;
}
}
/**
* 将输入的多信息字符串特殊字符换成“、”
*
* @param obj
* @return
*/
function checkIllegalChar(val) {
if (val) {
val =val.replace(/,/g,'、');
val =val.replace(/,/g,'、');
}
return val;
}
后台传出的字符串格式为:名称#@#类型|id,名称#@#类型|id
相关文章推荐
- js自动补全功能实现代码
- ext tree 异步加载取消自动加载功能。
- 基于jquery实现页面滚动到底自动加载数据的功能
- 基于AngularJS实现页面滚动到底自动加载数据的功能
- jquery实现搜索框自动补全功能,类似google搜索引擎,数据是用Ajax从后台获得
- Cocos2d-js 开发记录:图片数据资源等的异步加载
- 异步加载js并判断是否加载成功,类似jq的getScript()
- 如何调试异步加载的js文件
- 基于jquery实现页面滚动到底自动加载数据的功能
- Android:仿微博Listview与多线程功能(JSON、数据下载、图片加载、Listview、异步任务)
- java web在不使用任何插件情况下实现文本框输入自动补全功能
- asp.net 使用js分页实现异步加载数据
- u-boot-2009.08在mini2440上的移植(四)---增加DM9000驱动和命令自动补全功能 ——调试心得
- js异步加载服务端数据
- 如何在smarty中增加类似foreach的功能自动加载数据
- AngularJS:实现页面滚动到底自动加载数据的功能
- js数据显示在文本框中(页面加载显示和按钮触动显示)
- iScroll.js 向上滑动异步加载数据回弹问题
- Cocos2d-js 开发记录:图片数据资源等的异步加载