js实现可输入可选择的select下拉框


Posted in Javascript onDecember 21, 2016

本文实例为大家分享了可输入可选择的select下拉框,供大家参考,具体内容如下

1、原理:

1.1将input输入框和select框合并在一起,但是显示出向下点击的按钮:

js实现可输入可选择的select下拉框

这种比较容易做到

1.2出现输入值能够自动匹配的功能

动态的加载一个临时的div出现在该input下方,当点击页面中的空白地方,div隐藏。

1.3代码:

<!doctype html> 
<html lang="en"> 
 <head> 
 <meta charset="UTF-8"> 
 <meta name="Generator" content="EditPlus®"> 
 <meta name="Author" content=""> 
 <meta name="Keywords" content=""> 
 <meta name="Description" content=""> 
 <title>Document</title> 
 <script language="Javascript" src="/reserve/common/js/jquery-1.7.2.min.js"></script> 
 </head> 
 <body> 
 <div style="z-index:1" ><!-- style="position:relative;" --> 
  <span style="margin-left:100px;width:18px;overflow:hidden;"> 
  <select id='editable-Select--<%=i %>' name="editable-Select" onClick="getkindcode(this)" 
   style="width:185px;height:21px;margin-left:-100px;" > 
   
   <% 
   ArrayList acckindList = akc.accKindList(); 
   for(int j = 0;j<acckindList.size();j++){ 
   akdto = (accKindDto)acckindList.get(j); 
   %> 
   <option value="<%=akdto.getAcckindcode() %>--<%=akdto.getAcckindname() %>"> 
   <%=akdto.getAcckindcode() %>--<%=akdto.getAcckindname() %> 
   </option> 
   <%} %> 
  </select> 
  </span> 
 
  <input type="text" name="box" id='box_<%=i %>' onKeyup="changeText(this)" 
  style="width:165px;height:15px;margin-left:-190px;" 
  > 
 <script type="text/javascript"> 
 function changeText(obj){ 
 
 var len = document.getElementById('editable-Select--0').options.length ; 
 //alert(len); 
 var totalValues; 
 for(i=0;i<len;i++){ 
 totalValues+= document.getElementById('editable-Select--0').options[i].text+','; 
 } 
 //alert("totalValues.length=="+totalValues.length); 
 //alert("totalValues=="+totalValues); 
 var inputId= obj.id; 
 var inv = document.getElementById(obj.id).value; 
 //showTip(obj.id,totalValues); 
 var _inputNode = document.getElementById(inputId); 
 _inputValue = _inputNode.value; 
 if(/^[\s]*$/.test(_inputValue)){ 
 //alert("kongge"); 
 return; 
 } 
 _parentNode = _inputNode.parentNode; 
 _divNode = document.createElement("div"); 
 var config = { 
 backgroundColor: "#FFFFFF", 
 hoverBackgroundColor: "#BFEFFF", 
 divHeight: "100px", 
 divWidth: "180px", 
 divBorder: "1px solid gray", 
 overflowY: "scroll", 
 inputHeight: 20 
 
 }; 
 //console.log(_inputNode);--不兼容 
 //alert(_inputNode); 
 $.extend(true,config); 
 
 //如果已经存在了divNode 则删除 
 var _lastDivNode = document.getElementById(inputId+"_div");//$("#"+inputId+"_div")[0]; 
 if(_lastDivNode) 
 _parentNode.removeChild(_lastDivNode); 
 var _offsetPosition = getPosition(_inputNode); 
 //显示待选div样式 
 _divNode.id = inputId+"_div"; 
 //alert("div---:"+_divNode.id); 
 _divNode.style.height = config.divHeight; 
 _divNode.style.width = config.divWidth; 
 _divNode.style.overflowY = config.overflowY; 
 _divNode.style.display = "block"; 
 _divNode.style.border = config.divBorder; 
 _divNode.style.position = "absolute"; 
 _divNode.style.top = (_offsetPosition.y+config.inputHeight)+"px"; 
 _divNode.style.left = _offsetPosition.x+"px"; 
 
 
 //第一次加载的时候初始化样式文件 
 //var _headNode = $("head")[0]; 
 //alert("_headNode=="+_headNode); 
 //var _cssNode = document.createElement("style"); 
 //var _cssContent = "#"+_divNode.id+" div{background-color:"+config.backgroundColor+";}"; 
 //_cssContent += "#"+_divNode.id+" div:hover{background-color:"+config.hoverBackgroundColor+";}"; 
 //alert("_cssContent=="+_cssContent); 
 //_cssNode.innerHTML = _cssContent;// ie8不识别innerHTML 没有背景颜色是这里的问题 
 //alert("_cssNode=="+_cssNode.innerHTML); 
//兼容ie:动态加载样式 
 function includeStyleElement(styles,styleId) { 
 if (document.getElementById(styleId)) { 
 return 
 } 
 var style = document.createElement("style"); 
 style.id = styleId; 
 (document.getElementsByTagName("head")[0] || document.body).appendChild(style); 
 if (style.styleSheet) { //for ie 
 style.styleSheet.cssText = styles; 
 } else {//for w3c 
 style.appendChild(document.createTextNode(styles)); 
 } 
 } 
 var styles = "#"+_divNode.id+" div{background-color:"+config.backgroundColor+";}"; 
 styles+="#"+_divNode.id+" div:hover{background-color:"+config.hoverBackgroundColor+";}"; 
 includeStyleElement(styles,inputId+"_style"); 
 //alert(styles); 
 
 // _headNode.appendChild(document.createTextNode(cssContent)); 
 _divNode.innerHTML = ""; 
 var _divHtml = ""; 
 
 
 var optionobj = document.getElementById('editable-Select--0').options; 
 for(var i=0;i<optionobj.length;i++){ 
 var _tempValue = optionobj[i].value; 
 if(isIncluded(_tempValue,_inputValue)){ 
 _divHtml += "<div onclick='_inputDivClick(\""+inputId+"\",\""+_divNode.id+"\",\""+_tempValue+"\")'>"+_tempValue+"</div>"; 
 } 
 } 
 
 _divNode.innerHTML = _divHtml; 
 //alert("_divNode内容=="+_divNode.innerHTML); 
 if(_divNode.innerHTML == null || _divNode.innerHTML == "" ){ 
 hide(inputId); 
 } 
 _parentNode.appendChild(_divNode); 
 
 function hide(inputId) { 
 //alert("hide()----inputid=="+inputId); 
 var div_id = inputId+"_div"; 
 //document.getElementById(div_id).style.visibility = 'hidden'; 
 $('#'+div_id).css('display','none'); 
 } 
 
 
 /** 
 * _inputDivClick 当选中一个下拉列表选项时触发 
 * inputNodeId: 输入框的id 
 * divNodeId: 自动创建的div的id 
 * value: 待选值 
 */ 
 /* function _inputDivClick(inputNodeId,divNodeId,value){ 
 alert("_inputDivClick-----"); 
 var inputNode = document.getElementById(inputNodeId); 
 alert("inputNode=="+inputNode.value); 
 var divNode = document.getElementById(divNodeId); 
 //var divNode = $("#"+divNodeId)[0]; 
 inputNode.value = value; 
 alert("inputNode.value 选择点击值=="+inputNode.value); 
 inputNode.parentNode.removeChild(divNode); 
 } */ 
 
 /** 
 * isInclude方法用于测试source是否包含有pattern这个字符串 
 * source: 待测试的字符串 
 * pattern:文本框输入的值 
 */ 
 function isIncluded(source,pattern){ 
 var _reg = new RegExp(".*"+pattern+".*"); 
 return _reg.test(source); 
 } 
 //将要获取绝对位置的标签传进去,返回一个包含x和y属性的对象 
 function getPosition(e) 
 { 
 var t=e.offsetTop; 
 var l=e.offsetLeft; 
 while(e=e.offsetParent) 
 { 
  t+=e.offsetTop; 
  l+=e.offsetLeft; 
 } 
 var point = eval("({x:"+l+",y:"+t+"})"); 
 return point; 
 } 
 } 
 
</script> 
 <script type="text/javascript"> 
 /** 
 * _inputDivClick 当选中一个下拉列表选项时触发 
 * inputNodeId: 输入框的id 
 * divNodeId: 自动创建的div的id 
 * value: 待选值 
 */ 
 function _inputDivClick(inputNodeId,divNodeId,value){ 
 var inputNode = document.getElementById(inputNodeId); 
 //alert("inputNode=="+inputNode.value); 
 var divNode = document.getElementById(divNodeId); 
 //var divNode = $("#"+divNodeId)[0]; 
 inputNode.value = value; 
 //alert("inputNode.value 选择点击值=="+inputNode.value); 
 inputNode.parentNode.removeChild(divNode); 
 } 
 
 function getkindcode(obj){ 
 var index = obj.selectedIndex; // 选中索引 
 var text = obj.options[index].text; // 选中文本 
 var Kindvalue = obj.options[index].value; // 选中值 
 
 var acckindid=obj.id; 
 //alert(acckindid); 
 //alert(Kindvalue); 
 
 var inputid = "box_"+acckindid.split("--")[1]; 
 //alert("inputid:"+inputid); 
 var inputobj = document.getElementById(inputid); 
 inputobj.value = Kindvalue; 
 //alert("inputvalue2 :"+inputobj.value); 
 } 
 
 </script> 
 
 <font color="red" size="2px">* </font><font size="2px">输入格式:代码&&名称</font> 
 </div> 
 <script type="text/javascript"> 
 var boxs = document.getElementsByName("box"); 
 var num = boxs.length; 
 /* 点击空白出隐藏临时div */ 
 $(document).bind('click',function(e){ 
 var e = e || window.event; //浏览器兼容性 
 var elem = e.target || e.srcElement; 
 //alert("elem.id=="+elem.id); 
 for(var i=0;i<num;i++){ 
 var divID = "box_"+i+"_div"; 
 while (elem) { //循环判断至跟节点,防止点击的是div子元素 
 if (elem.id && elem.id==divID) { 
 return; 
 } 
 elem = elem.parentNode; 
 } 
 $('#'+divID).css('display','none'); //点击的不是div或其子元素 
 } 
 }); 
 
 </script> 
 </body> 
</html>

1.4效果:

js实现可输入可选择的select下拉框

option的值是从数据库中读出来的,页面会有很多这样的,所以每个inpout的id说循环的。

1.5说明:

这个要应用jquery库,我引用的是系统中有的jquery-1.7.2.min.js

要是只有一个输入框,可以把input的id写死。

我用这个适应为客户用的浏览器是ie8的,我必须要兼容ie8才行,虽然现在很多jquery框架很简单和方便的实现功能,但这种是最原始的,或许还有点麻烦,参考参考。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jQuery实现点击同时更改两个iframe的网址
Jul 01 Javascript
javascript的switch用法注意事项分析
Feb 02 Javascript
详解javascript数组去重问题
Nov 06 Javascript
JS生成某个范围的随机数【四种情况详解】
Apr 20 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
Nov 16 Javascript
最常见的左侧分类菜单栏jQuery实现代码
Nov 28 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
Dec 08 Javascript
基于LayUI实现前端分页功能的方法
Jul 22 Javascript
react router 4.0以上的路由应用详解
Sep 21 Javascript
cordova+vue+webapp使用html5获取地理位置的方法
Jul 06 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
Jun 29 Javascript
vant中的toast层级改变操作
Nov 04 Javascript
详解handlebars+require基本使用方法
Dec 21 #Javascript
JS实现的驼峰式和连字符式转换功能分析
Dec 21 #Javascript
JS实现的RGB网页颜色在线取色器完整实例
Dec 21 #Javascript
js querySelector() 使用方法
Dec 21 #Javascript
简单实现Vue的observer和watcher
Dec 21 #Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
Dec 21 #Javascript
js实现开启密码大写提示
Dec 21 #Javascript
You might like
功能齐全的PHP发送邮件类代码附详细说明
2008/07/10 PHP
又一个php 分页类实现代码
2009/12/03 PHP
php学习笔记 面向对象的构造与析构方法
2011/06/13 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
浅析tr的隐藏和显示问题
2014/03/05 Javascript
当达到输入长度时表单自动切换焦点
2014/04/06 Javascript
angularjs实现与服务器交互分享
2014/06/24 Javascript
jQuery实现视频作为全屏幕背景
2014/12/18 Javascript
jQuery中mouseover事件用法实例
2014/12/26 Javascript
JQuery页面地址处理插件jqURL详解
2015/05/03 Javascript
JavaScipt选取文档元素的方法(推荐)
2016/08/05 Javascript
浅谈javascript中的数据类型转换
2016/12/27 Javascript
微信小程序实现图片轮播及文件上传
2017/04/07 Javascript
JavaScript如何借用构造函数继承
2019/11/06 Javascript
js实现验证码功能
2020/07/24 Javascript
Nodejs 微信小程序消息推送的实现
2021/01/20 NodeJs
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
python获取局域网占带宽最大3个ip的方法
2015/07/09 Python
菜鸟使用python实现正则检测密码合法性
2016/01/05 Python
实例讲解Python的函数闭包使用中应注意的问题
2016/06/20 Python
Python3之简单搭建自带服务器的实例讲解
2018/06/04 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
2019/06/28 Python
深入浅析python的第三方库pandas
2020/02/13 Python
Python闭包装饰器使用方法汇总
2020/06/29 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
python 利用百度API识别图片文字(多线程版)
2020/12/14 Python
什么是数据抽象
2016/11/26 面试题
卫生巾广告词
2014/03/18 职场文书
先进事迹报告会主持词
2014/04/02 职场文书
党的群众路线教育实践活动对照检查材料思想汇报
2014/09/19 职场文书
二手房购房协议书范本
2014/10/05 职场文书
大连星海广场导游词
2015/02/10 职场文书
护士年终个人总结
2015/02/13 职场文书
python playwrigh框架入门安装使用
2022/07/23 Python