`
JavaSam
  • 浏览: 951770 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javascript自动补全 支持键盘上下键 可以自定义数据,处理函数

 
阅读更多
/**
 * @author wsf(自动补全动补全 支持键盘上下键)
 */
;
(function (win,$){
	// 客户自动补全对象
	function _autoComplete(){
		this.dataUrl = "/xxxx/customerwidget/queryAllCustName.do";// action
		this.data = null;// 数据
		this.target = null;// 作用于哪个元素(input)
		this.defaultText = "搜索:全称/简称/首字母";//输入框默认显示字符
       this.autoName = ["INITIALALLNAME","FULLNAME"];//自动补全名称
		this.panelWidth = 385;
		this.panelHeight = 360;
		this.event = {
				"click":this.click,
				"focus":this.focus,
				"keyup":this.keyup,
				"keydown":this.keydown,
				"blur":this.blur,
				"input propertychange":this.propChange
		};
		this.isArrawKey = false;// 是否是上下键
		this.log = function (msg){
			console.log(msg);
		},
      //自定义函数(比如说按下 enter键后)
        this.customerFn = function (){
   
        }
	}
	// 原型对象
	_autoComplete.prototype = {
			// 构造函数
			curstructor:_autoComplete,
			//获取数据
			getData:function (){
				var that = this;
				$.getJSON(this.dataUrl,function (data){
					that.data = data;
				})
			},
			// 入口函数
			autoCompleteStart:function (targetid){
				if(this.data==null);
				   this.getData();
				this.target = $("#"+targetid);
				this.target.bind(this.event,this);
			},
			// 单击事件
			click:function(e){
				var that = e.data;
				var _val = $(that.target).val();
				if(_val.indexOf("搜索:")>=0)
					$(that.target).val("");
				else{
					that.autoComplete.call(that,e,_val);
				}
			},
			// 获得焦点事件
			focus:function (e){
				var that = e.data;
				var keycode = e.which;
			},
			// 松开键盘
			keyup:function (e){
				var that = e.data;
				var keycode = e.which;
				var _val = $(that.target).val();
				if(!$.trim(_val)){
					$("#autoComoplete").slideUp(300);
				}else {
					if(!that.isArrawKey)
					   that.autoComplete.call(that,e,_val);
				}
				that.isArrawKey = false;
			},
			// 按下键盘
			keydown:function(e){
				var that = e.data;
				var keycode = e.which;
				if(keycode == 13){
					$(that.target).blur();
				}
				var _kids,_first,h = [];
				_kids = $("#autoComoplete").find("li");//
				_first = _kids.first();// 第一个孩子
				h = _kids.filter(function (){
					return $(this).attr("downSelected") == "true";//被选过
				});
				if(keycode == 40){
					that.isArrawKey = true;// 向下箭头
					if(!h[0]){
						// 没有被选中过
						_first[0].setAttribute("downSelected",true);
						_first.css("background-color","rgb(251, 236, 136)");
						$(that.target).val(_first.text());
					}else{
						// 有选中的
						h[0].setAttribute("downSelected",false);
						h.css("background-color","#FFF");
						var _nxt = h.next();
						_nxt[0].setAttribute("downSelected",true);
						_nxt.css("background-color","rgb(251, 236, 136)");
						$(that.target).val(_nxt.text());
					}
				}
				if(keycode == 38){
					that.isArrawKey = true;// 向上箭头
					if(h[0]){
						// 有选中的
						h[0].setAttribute("downSelected",false);
						h.css("background-color","#FFF");
						var _prev = h.prev();
						_prev[0].setAttribute("downSelected",true);
						_prev.css("background-color","rgb(251, 236, 136)");
						$(that.target).val(_prev.text());
					}
				}
			},
			// 失去焦点
			blur:function (e){
				var that = e.data;
				var keycode = e.which;
				$("#autoComoplete").slideUp(300);
				var _val = $(that.target).val();
				if(!$.trim(_val)){
					$(that.target).val(that.defaultText);
				}
			},
			// propertychange事件
			propChange:function (e){
				var that = e.data;
				that.log("porp");
				var keycode = e.which;
				var _val = $.trim($(that.target).val());
				if(!_val){
					$("#autoComoplete").slideUp(300);
						$(that.target).val(that.defaultText);
				}
			},
			// 自动补全主方法
			autoComplete:function (e,value) {
				if(!value) return;
				var srcEle = $("#autoComoplete");
				var html = [];
				var _d = this.data;
				for(var i = 0 ;i < _d.length;i++){
					var item = _d[i];
					var shouzimu = item[this.autoName[0]];//;
					var name  = item[this.autoName[1]];//
					var idx = name.indexOf(value);
					var idx2 = shouzimu.indexOf(value);
					if(idx >= 0||idx2>=0){
						var _id = item.ID;
						var prev,last;
						if(idx2>=0){
							var _len = value.length;
							prve = name.substring(0,_len);
							last = name.substring(_len);
							var _name = "<font color='blue' style='font-weight:bold;'>" + prve + "</font>" + last;
							html.push('<li class="autoItem"  style="height:24px;line-height:24px;overflow:hidden;list-style:none;font-size:13px;margin:10px 0 8px 0;cursor:pointer;"><a id='+_id+'>' + _name + "</a></li>");
						}else if(idx>=0){
							prev = name.substring(0,idx);
							last = name.substring(idx+value.length);
							var _name = prev + "<font color='blue' style='font-weight:bold;'>" + value + "</font>" + last;
							html.push('<li class="autoItem"  style="height:24px;line-height:24px;overflow:hidden;list-style:none;font-size:13px;margin:10px 0 8px 0;cursor:pointer;"><a id='+_id+'>' + _name + "</a></li>");
						}
					}
				}
				if(html.length==0){
                                     $("#autoUl").html("");
                                  return;
                                 }
				html = html.slice(0,10);//值取前十条
				var _pos = $(this.target).position();
				var _inputHeight = $(this.target).height();
				if(!srcEle[0]){
					var div = $("<div id='autoComoplete' style='diplay:none;'><div>");
					var ul = $("<ul id='autoUl'></ul>");
					ul.append(html).appendTo(div);
					ul.css({
						"padding":"0",
						"margin":"0",
						"padding-left":"15px",
					});
					div.css({
						"position":'fixed',
						"top":_pos.top+_inputHeight,
						"left":_pos.left,
						"background-color":"#fff",
						"border":"1px solid lightblue",
						"width":this.panelWidth + "px",
						"height":this.panelHeight + "px",
						"overflow":"hidden",
						"border-top":"none",
						"z-index":"9999999999"
							
					});
					div.appendTo($("body")).slideDown(300);
				}else{
					$("#autoUl").html(html);
					srcEle.css({
						"position":'fixed',
						"top":_pos.top+_inputHeight,
						"left":_pos.left,
					});
					srcEle.slideDown(300);
				}
				
				this.after();
				
			},
			//列表显示后函数
		    after:function (){
		    	$(".autoItem").hover(function (){
		    		$(this).addClass("currentLi");
		    	},function (){
		    		$(this).removeClass("currentLi");
		    	}).click(function (){
		    		$(this.target).val($(this).find("a").text());
		    		$(this).parent().parent().slideUp(300);
		    	});
		    }
	}
	win._autoComplete = _autoComplete;// 外部调用入口
})(window,jQuery);


/**
 * 调用方式
 * var ac = new _autoComplete();//自动补全
	ac.defaultText = "";
	ac.panelWidth = 300;
	//还可以设置其他自定义属性
        ac.customerFn = $.commonSearch;//一个搜索函数(当敲下enter键后回执行此方法)
	ac.autoCompleteStart("custCnName");//input id
 */


 

 

3
2
分享到:
评论
2 楼 jiang0 2014-07-25  
这么复杂?
1 楼 470275283 2014-07-25  

  学习了

相关推荐

    js自动补全

    **JavaScript自动补全功能详解** JavaScript自动补全(也称为智能提示或代码补全)是开发者在编写代码时的一种高效工具,它能提供基于上下文的建议,帮助快速输入语句,提高编程效率。在本篇文章中,我们将深入探讨...

    JavaScript 文本框下拉自动补全提示

    JavaScript文本框下拉自动补全提示是一种常见的交互设计,它极大地提升了用户在输入时的效率和体验。在网页开发中,这种功能常用于搜索框、表单输入等场景,允许用户在输入过程中根据已有的数据集获取匹配的建议,...

    JS自动补全下拉框代码

    JavaScript自动补全功能,也称为智能提示或自动完成,是一种常见的前端交互设计,常用于搜索引擎、表单输入等场景,以提升用户体验。本代码示例实现了基础的自动补全功能,但AJAX部分需要开发者自行添加。以下是关于...

    自动补全(可模糊搜索)的输入框

    在压缩包内的“自动补全提示输入框”文件中,你应该能够找到实现这一功能的JavaScript代码,包括输入事件监听、模糊搜索算法、匹配项渲染以及键盘事件处理等部分。通过阅读和理解这些代码,你可以学习到如何在实际...

    邮箱自动补全代码

    3. **事件监听**:在JavaScript中,可以使用`addEventListener`方法监听用户的键盘输入事件,如`input`或`keyup`,在事件触发时调用处理函数,更新补全列表。 4. **DOM操作**:为了在页面上显示补全建议,JS需要...

    jQuery ajax搜索框自动补全代码

    Ajax请求成功后,会执行回调函数,这里可以处理服务器返回的数据。数据通常是JSON格式,包含一系列建议的搜索词。例如,可以遍历数据并创建HTML元素展示在`#autoComplete`元素内。 5. **搜索回调函数**: 可以...

    jquery 自动补全搜索框控件

    jQuery 自动补全搜索框控件是Web开发中常用的一种功能,它极大地提高了用户体验,尤其在需要用户输入关键字进行查询的场景下。该控件基于jQuery库,通过实时匹配用户输入,动态显示一个建议列表,帮助用户快速找到...

    类google、baidu文本输入框自动补全

    这个插件可能具有处理大量数据的能力,适合大数据集下的自动补全需求。 2. **基本原理**: 自动补全的基本原理是监听用户在输入框中的输入事件,如键盘按键或删除操作。每当输入变化时,会触发一个请求到服务器,...

    reactnative编辑框自动补全组件适配android跟ios

    在这个例子中,`handleQueryChange`函数处理输入框内容的变化,根据查询内容过滤数据源并更新到组件状态。`data`属性是包含所有可能补全选项的数据源,`placeholder`定义了输入框的占位提示,而`onChangeText`和`...

    自动补全控件demo.zip

    在JavaScript中,可以使用正则表达式或自定义函数来实现。 4. **显示面板**:展示匹配项的区域,通常是一个下拉列表,随着用户输入动态更新。这个面板需要良好的样式设计,以适应不同场景下的视觉需求。 5. **事件...

    Ajax自动补全效果实例

    在本实例中,我们将深入探讨如何实现一个类似百度或Google搜索的自动补全功能,这个功能可以在用户输入时动态地提供建议,提高用户体验。 首先,我们需要理解Ajax的工作原理。Ajax的核心是XMLHttpRequest对象,它...

    jQuery自动补全自动提示插件仿百度自动提示插件

    综上所述,jQuery自动补全插件通过监听用户输入、发送AJAX请求、处理返回数据以及动态渲染提示列表,实现了类似百度搜索的自动提示功能。开发者可以根据需求调整插件参数,自定义提示样式,以适应不同的应用场景。在...

    文本框Autocomplete支持键盘上下选择,示例3个类型数据源

    综上所述,这个示例旨在演示如何使用jQuery UI Autocomplete插件,特别是配合键盘上下选择功能,以及处理不同类型的提示数据源,包括静态数组、动态Ajax请求和函数回调。对于前端开发者来说,理解和掌握这一功能将有...

    java与jQuery整合ajax仿googleSuggest自动补全实例

    最后,`js`目录可能包含了除jQuery之外的其他JavaScript库或自定义脚本,如用于辅助处理AJAX请求、数据绑定或者UI交互的函数。 总结起来,这个实例展示了如何利用Java后端和jQuery前端,结合AJAX技术,实现一个动态...

    jquery suggest 自动补全插件演示

    jQuery Suggest插件还支持多种高级特性,如自定义显示模板、过滤逻辑、回调函数等,可以根据实际需求进行配置。例如,可以设置一个模板来展示建议项的样式: ```javascript $("#searchInput").suggest({ source: ....

    Javascript软键盘

    1. 自定义脚本:开发者可以手动编写JavaScript代码,定义键盘布局、按键功能以及响应用户交互的事件处理函数。这种方法需要一定的JavaScript基础,但具有高度的灵活性和可定制性。 2. 使用现成的库:市面上存在许多...

    用Html+Js实现的“自动补全”功能 (2).pdf

    首先,这个功能的需求是:根据用户在文本框中输入的文字,实时匹配并显示与之相关的数据,同时支持使用键盘方向键浏览选项,以及通过鼠标点击或键盘回车选择数据项并更新到文本框中。 在实现过程中,作者采用了以下...

    用Html+Js实现的“自动补全”功能 (2).docx

    2. 用户可以通过键盘的上下方向键浏览匹配项。 3. 通过鼠标点击或按下回车键,用户可以选择并显示选定的匹配数据在输入框中。 实现步骤如下: **HTML 结构分析:** HTML部分通常包括一个输入框和一个用于显示匹配...

    用Html+Js实现的“自动补全”功能.pdf

    - 用户可以通过键盘的方向键上/下来浏览匹配项,回车键选择某一项。 4. **兼容性和优化**: - 为了确保功能在多个浏览器中正常工作,需要进行跨浏览器的兼容性测试,尤其是针对IE系列的浏览器。 - 数据匹配和...

    用Html+Js实现的“自动补全”功能.docx

    此外,将自动补全功能封装为JSP自定义标签可以使代码重用性更强,便于在多个页面中应用。 总结,HTML+JS实现自动补全功能主要涉及到HTML结构设计、JavaScript事件监听、数据匹配以及DOM操作。在实际应用中,还要...

Global site tag (gtag.js) - Google Analytics