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 相关文章推荐
Javascript调用XML制作连动下拉列表框
Jun 25 Javascript
js类中获取外部函数名的方法
Aug 19 Javascript
javascript实现的动态添加表单元素input,button等(appendChild)
Nov 24 Javascript
jquery checkbox,radio是否选中的判断代码
Mar 20 Javascript
JavaScript 构造函数 面相对象学习必备知识
Jun 09 Javascript
jQuery对象和Javascript对象之间转换的实例代码
Mar 20 Javascript
jquery的总体架构分析及实现示例详解
Nov 08 Javascript
提高jQuery性能优化的技巧
Aug 03 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
Dec 10 Javascript
设置点击文本框或图片弹出日历控件的实现代码
May 12 Javascript
Vuex入门到上手教程
Jun 20 Javascript
layui 优化button按钮和弹出框的方法
Aug 15 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 pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
2012/05/06 PHP
PHP根据IP判断地区名信息的示例代码
2014/03/03 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
Thinkphp极验滑动验证码实现步骤解析
2020/11/24 PHP
JQuery中使用on方法绑定hover事件实例
2014/12/09 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
2015/09/30 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
Bootstrap每天必学之缩略图与警示窗
2015/11/29 Javascript
JavaScript中的Object对象学习教程
2016/05/20 Javascript
AngularJS教程之MVC体系结构详解
2016/08/16 Javascript
BootStrap入门教程(一)之可视化布局
2016/09/19 Javascript
angular-ngSanitize模块-$sanitize服务详解
2017/06/13 Javascript
AngularJS中下拉框的高级用法示例
2017/10/11 Javascript
JS插件clipboard.js实现一键复制粘贴功能
2020/12/04 Javascript
vue--点击当前增加class,其他删除class的方法
2018/09/15 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
一个因@click.stop引发的bug的解决
2019/01/08 Javascript
JS回调函数 callback的理解与使用案例分析
2019/09/09 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
2020/04/11 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
在Python中进行自动化单元测试的教程
2015/04/15 Python
在Windows系统上搭建Nginx+Python+MySQL环境的教程
2015/12/25 Python
Python数据结构与算法之字典树实现方法示例
2017/12/13 Python
python获取网页中所有图片并筛选指定分辨率的方法
2018/03/31 Python
Pycharm无法使用已经安装Selenium的解决方法
2018/10/13 Python
python实现换位加密算法的示例
2018/10/14 Python
Python 实现一行输入多个数字(用空格隔开)
2020/04/29 Python
使用opencv中匹配点对的坐标提取方式
2020/06/04 Python
python3获取控制台输入的数据的具体实例
2020/08/16 Python
C++面试题目
2013/06/25 面试题
后勤工作职责
2013/12/22 职场文书
学习党的群众路线教育实践活动心得体会
2014/03/01 职场文书
学校清洁工岗位职责
2015/04/15 职场文书