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的弹出消息插件 DivAlert之旅(一)
Apr 01 Javascript
jQuery实现鼠标经过图片预览大图效果
Apr 10 Javascript
JS跨域问题详解
Nov 25 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
Nov 15 Javascript
理解JavaScript表单的基础知识
Jan 25 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
Mar 02 Javascript
jQuery提示插件qTip2用法分析(支持ajax及多种样式)
Jun 08 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
Aug 01 Javascript
js根据json数据中的某一个属性来给数据分组的方法
Oct 08 Javascript
JavaScript怎样在删除前添加确认弹出框?
May 27 Javascript
JS绘图Flot如何实现动态可刷新曲线图
Oct 16 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
Nov 19 Vue.js
详解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
法兰绒滤网冲泡
2021/03/03 冲泡冲煮
一个PHP+MSSQL分页的例子
2006/10/09 PHP
一个PHP的ZIP压缩类分享
2014/05/04 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
jquery.ui.draggable中文文档
2009/11/24 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
jQuery常用样式操作实例分析(获取、设置、追加、删除、判断等)
2016/09/08 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
Javascript this 函数深入详解
2016/12/13 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
2017/09/01 Javascript
angular.js实现购物车功能
2017/10/23 Javascript
vue的常用组件操作方法应用分析
2018/04/13 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
如何使用puppet替换文件中的string
2018/12/06 Javascript
JS与SQL方式随机生成高强度密码示例
2018/12/29 Javascript
通过实践编写优雅的JavaScript代码
2019/05/30 Javascript
Vue移动端右滑屏幕返回上一页附源码下载
2019/06/26 Javascript
webpack常用构建优化策略小结
2019/11/21 Javascript
给Python IDLE加上自动补全和历史功能
2014/11/30 Python
Python学习之Django的管理界面代码示例
2018/02/10 Python
Django项目开发中cookies和session的常用操作分析
2018/07/03 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
Python玩转PDF的各种骚操作
2019/05/06 Python
详解PyTorch手写数字识别(MNIST数据集)
2019/08/16 Python
为中国消费者甄选天下优品:网易严选
2016/08/11 全球购物
Hammitt官网:设计师手袋
2020/05/23 全球购物
三方协议书范本
2014/04/22 职场文书
对党的十八届四中全会的期盼
2014/10/17 职场文书
有限责任公司股东合作协议书
2014/12/02 职场文书
采购内勤岗位职责
2015/04/13 职场文书
预备党员党支部意见
2015/06/02 职场文书
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS
CSS3 Tab动画实例之背景切换动态效果
2021/08/23 HTML / CSS
Python简易开发之制作计算器
2022/04/28 Python
Java中Dijkstra(迪杰斯特拉)算法
2022/05/20 Java/Android