js实现select组件的选择输入过滤代码


Posted in Javascript onOctober 14, 2014

实现select组件的选择输入过滤作用的js代码如下:

/**

*其中//******之间的部分显示的是在没有选择输入过滤功能的代码上加入的功能代码

**

/
/** 
* @description This plugin allows you to make a select box editable like a text box while keeping it's select-option features
* @description no stylesheets or images are required to run the plugin
*
* @version 0.0.1
* @author Martin Mende
* @license Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0)
* @license For comercial use please contact me: martin.mende(at)aristech.de
* 
* @requires jQuery 1.9+
*
* @class editableSelect
* @memberOf jQuery.fn
*
* @example
*
* var selectBox = $("select").editableSelect();
* selectBox.addOption("I am dynamically added");
*/

(function ( $ ) {

$.fn.editableSelect = function() {
var instanceVar;
//此this.each()指的就是对当前对象的遍历,这里的当前对象指代的就是对当前两个下拉选择框对象的一一遍历
this.each(function(){
var originalSelect = $(this);
//check if element is a select
if(originalSelect[0].tagName.toUpperCase()==="SELECT"){
//wrap the original select在原始的<select>外围插入<div></div>框
originalSelect.wrap($("<div/>"));
var wrapper = originalSelect.parent();
wrapper.css({display: "inline-block"});
//place an input which will represent the editable select
//在选择菜单上加入input输入框<input alt title ..... style="width:......" value="">
var inputSelect = $("<input/>").insertBefore(originalSelect);
//get and remove the original id
var objID = originalSelect.attr("id");
originalSelect.removeAttr("id");
//add the attributes from the original select
//input输入框的各种属性设置
inputSelect.attr({
alt: originalSelect.attr("alt"),
title: originalSelect.attr("title"),
class: originalSelect.attr("class"),
name: originalSelect.attr("name"),
disabled: originalSelect.attr("disabled"),
tabindex: originalSelect.attr("tabindex"),
id: objID
});
//get the editable css properties from the select
var rightPadding = 15;
inputSelect.css({
width: originalSelect.width()-rightPadding,
height: originalSelect.height(),
fontFamily: originalSelect.css("fontFamily"),
fontSize: originalSelect.css("fontSize"),
background: originalSelect.css("background"),
paddingRight: rightPadding
});
inputSelect.val(originalSelect.val());
//add the triangle at the right
var triangle = $("<div/>").css({
height: 0, width: 0,
borderLeft: "5px solid transparent",
borderRight: "5px solid transparent", 
borderTop: "7px solid #999",
position: "relative",
top: -(inputSelect.height()/2)-5,
left: inputSelect.width()+rightPadding-10,
marginBottom: "-7px",
pointerEvents: "none"
}).insertAfter(inputSelect);
//create the selectable list that will appear when the input gets focus
//聚焦的时候加上<ol><ol/>下拉框
var selectList = $("<ol/>").css({
display: "none",
listStyleType: "none",
width: inputSelect.outerWidth()-2,
padding: 0,
margin: 0,
border: "solid 1px #ccc",
fontFamily: inputSelect.css("fontFamily"),
fontSize: inputSelect.css("fontSize"),
background: "#fff",
position: "absolute",
zIndex: 1000000
}).insertAfter(triangle);
//add options
//在resourceData变量中存储当前下拉框中的所有数据
//******
var resourceData = [];
originalSelect.children().each(function(index, value){
prepareOption($(value).text(), wrapper);
resourceData.push($(value).text());
});
//******
//bind the focus handler
//在鼠标聚焦的时候fadeIn(100),即下拉显示当前下拉框
inputSelect.focus(function(){
selectList.fadeIn(100);
//v存储的是在input输入框中输入的内容,如果输入的内容不为空,就在存储原始下拉框的所有数据中找到出现v中字符的数据压入newResourceData变量中
//******
var v = inputSelect.val();
var newResourceData = [];
if(v != "") {
$.each(resourceData, function(i, t){
if(t.indexOf(v) != -1)
newResourceData.push(t);
});
}
wrapper.children("ol").empty();
$.each(newResourceData, function(i, t){
prepareOption(t, wrapper);
});
//******
}).blur(function(){
selectList.fadeOut(100); 
}).keyup(function(e){
if(e.which==13) inputSelect.trigger("blur");
//在enter快捷键按下后弹起的时候执行的事件
//******
var v = inputSelect.val();
var newResourceData = [];
if(v != "") {
$.each(resourceData, function(i, t){
if(t.indexOf(v) != -1)
newResourceData.push(t);
});
}
wrapper.children("ol").empty();
$.each(newResourceData, function(i, t){
prepareOption(t, wrapper);
});
//******
});
//hide original element
originalSelect.css({visibility: "hidden", display: "none"});

//save this instance to return it
instanceVar = inputSelect
}else{
//not a select
return false;
}
});//-end each

/** public methods **/

/**
* Adds an option to the editable select
* @param {String} value - the options value
* @returns {void}
*/
instanceVar.addOption = function(value){
prepareOption(value, instanceVar.parent()); 
};

/**
* Removes a specific option from the editable select
* @param {String, Number} value - the value or the index to delete
* @returns {void}
*/
instanceVar.removeOption = function(value){
switch(typeof(value)){
case "number":
instanceVar.parent().children("ol").children(":nth("+value+")").remove();
break; 
case "string":
instanceVar.parent().children("ol").children().each(function(index, optionValue){
if($(optionValue).text()==value){
$(optionValue).remove();
}
});
break;
} 
};

/**
* Resets the select to it's original
* @returns {void}
*/
instanceVar.restoreSelect = function(){
var originalSelect = instanceVar.parent().children("select");
var objID = instanceVar.attr("id");
instanceVar.parent().before(originalSelect);
instanceVar.parent().remove();
originalSelect.css({visibility: "visible", display: "inline-block"});
originalSelect.attr({id: objID});
};

//return the instance
return instanceVar;
};

/** private methods **/
//prepareOption函数的作用就是在当前下拉框中添加新选项
function prepareOption(value, wrapper){
var selectOption = $("<li>"+value+"</li>").appendTo(wrapper.children("ol"));
var inputSelect = wrapper.children("input");
selectOption.css({
padding: "3px",
textAlign: "left",
cursor: "pointer" 
}).hover(
function(){
selectOption.css({backgroundColor: "#eee"});
},
function(){
selectOption.css({backgroundColor: "#fff"}); 
});
//bind click on this option
selectOption.click(function(){
inputSelect.val(selectOption.text());
inputSelect.trigger("change");
}); 
}

}( jQuery ));
Javascript 相关文章推荐
Javascript var变量隐式声明方法
Oct 19 Javascript
jquery中动态效果小结
Dec 16 Javascript
idTabs基于JQuery的根据URL参数选择Tab插件
Apr 11 Javascript
Javascript中Event属性搜集整理
Sep 17 Javascript
javascript写的一个模拟阅读小说的程序
Apr 04 Javascript
JavaSacript中charCodeAt()方法的使用详解
Jun 05 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
Oct 26 Javascript
基于javascript实现全屏漂浮广告
Mar 31 Javascript
js仿京东轮播效果 选项卡套选项卡使用
Jan 12 Javascript
使用jQuery实现购物车结算功能
Aug 15 jQuery
Vue实现用户自定义字段显示数据的方法
Aug 28 Javascript
Node.js 多进程处理CPU密集任务的实现
May 26 Javascript
javascript记录文本框内文字个数检测文字个数变化
Oct 14 #Javascript
返回顶部按钮响应滚动且动态显示与隐藏
Oct 14 #Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
Oct 14 #Javascript
一个JavaScript递归实现反转数组字符串的实例
Oct 14 #Javascript
js解决select下拉选不中问题
Oct 14 #Javascript
基于js与flash实现的网站flv视频播放插件代码
Oct 14 #Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
Oct 14 #Javascript
You might like
把77A收信机改造成收音机
2021/03/02 无线电
将酷狗krc歌词解析并转换为lrc歌词php源码
2014/06/20 PHP
UTF-8正则表达式如何匹配汉字
2015/08/03 PHP
yii2的restful api路由实例详解
2019/05/14 PHP
laravel框架模型、视图与控制器简单操作示例
2019/10/10 PHP
一个级联菜单代码学习及removeClass与addClass的应用
2013/01/24 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
jQuery通过扩展实现抖动效果的方法
2015/03/11 Javascript
JavaScript获取页面上被选中文字的方法技巧
2015/03/13 Javascript
jQuery替换textarea中换行的方法
2015/06/10 Javascript
JavaScript实现添加、查找、删除元素
2015/07/02 Javascript
jQuery表单验证功能实例
2015/08/28 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
2015/09/27 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
jQuery中的基本选择器用法学习教程
2016/04/14 Javascript
AngularJS Phonecat实例讲解
2016/11/21 Javascript
jQuery复合事件用法示例
2017/06/10 jQuery
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
Vue计算属性的使用
2017/08/04 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
详解Vue.js 响应接口
2020/07/04 Javascript
如何管理Vue中的缓存页面
2021/02/06 Vue.js
讲解Python中的标识运算符
2015/05/14 Python
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
Tornado 多进程实现分析详解
2018/01/12 Python
python3获取两个日期之间所有日期,以及比较大小的实例
2018/04/08 Python
Python实现随机漫步功能
2018/07/09 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
厨房工作人员岗位职责
2013/11/15 职场文书
火锅店营销方案
2014/02/26 职场文书
高三励志标语
2014/06/05 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
英语课前三分钟演讲稿(6篇)
2014/09/13 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
保护环境的宣传语
2015/07/13 职场文书