自己写的select元素可编辑、可筛选JQuery插件 jquery.inputselectbox.js
/*
功能:实现对select下拉框可输入的功能, 输入时会对下拉框的内容进行动态过滤。
参数:没有选择任何值时默认显示的文字
如何使用:$("#firstLevel").inputSelectBox("--请选择--");
如何获取选择的项:直接使用原始的select元素即可,值会在下拉框隐藏后同步到原始元素
*/
(function ($) {
$.fn.inputSelectBox = function (emptyText) {
if (!emptyText) emptyText = ""; //参数默认值:用来填充当输入框input中为空时的值
var blurFlag = true; //用来表示是否要隐藏下拉选择框,hideSelectList会判断此标识(当焦点在input输入框,在下拉选择框里时,不能隐藏。其他场景时隐藏).此标识的作用例如:input失去焦点,按理应该隐藏下拉框,但随着下拉框获取焦点,这时下拉框获得焦点的事件就阻止了隐藏下拉框的请求。 //1.隐藏原来的select元素
var sel = $(this);
sel.hide(); //2.创建必要的对象
//输入框
var input = $("<input type='text' style='width:" + (sel.width() - 4) + "px'></input>");
//下拉选择框
var selectList = $("<select style='width:" + sel.width() + "px' size='10'>" + sel.html() + "</select>"); //3.input在原来select处
input.insertBefore(sel);
//给input绑定事件
input.click(function () {
selectList.show();
}).focus(function () {
//获得焦点,显示下拉选择框
input.select();
blurFlag = false;
selectList.css({ "position": "absolute", "left": input.offset().left + "px", "top": (input.offset().top + input.outerHeight()) + "px" }).show();
}).blur(function () {
//失去焦点,隐藏下拉选择框。注意,如果此时鼠标移到了下拉选择框,则不隐藏
blurFlag = true;
window.setTimeout(function () { hideSelectList('input.blur'); }, 50); //setTimeout的原因是可能用户在输入框、下拉选择框间移动鼠标,这里给一个时间差的缓冲,下同
}).keyup(function (e) {
//console.log(e.keyCode);
if (e.ctrlKey || e.altKey || e.shiftKey ||
e.keyCode == 20 || e.keyCode == 16 || e.keyCode == 17 || e.keyCode == 18 || e.keyCode == 91 || e.keyCode == 93 || e.keyCode == 35 || e.keyCode == 36) return;//非输入键、组合键,这里直接忽略
//输入文字时,下拉选择框的内容跟随变化
switch (e.keyCode) {
case 38:
//向上按钮
break;
case 40:
//向下按钮
break;
case 13:
//回车:确定选择
blurFlag = true;
window.setTimeout(function () { hideSelectList("input enter keyup"); }, 50);
break;
default:
quickFilter(input.val());
break;
}
}).keydown(function (e) {
//输入文字时,下拉选择框的内容跟随变化
switch (e.keyCode) {
case 38:
//向上按钮
selectList.show();
selectList.get(0).selectedIndex--;
input.val(selectList.find("option:selected").text());
break;
case 40:
//向下按钮
selectList.show();
selectList.get(0).selectedIndex++;
input.val(selectList.find("option:selected").text());
break;
default:
break;
}
}); //4.下拉选择框:一个新的select
selectList.appendTo("body");
selectList.hide();
selectList.focus(function () {
blurFlag = false;
}).blur(function () {
blurFlag = true;
window.setTimeout(function () { hideSelectList('selectList.blur'); }, 50);
}).click(function () {
input.val($(this).find("option:selected").text());
blurFlag = true;
window.setTimeout(function () { hideSelectList('selectList.click'); }, 50);
}); //5.输入框初始化,如果原select有选择值,这里会初始化
if (selectList.get(0).selectedIndex >= 0) {
input.val(selectList.find("option:selected").text());
input.data("selectValue", selectList.val);
} else {
input.val(emptyText);
input.data("selectValue", "");
} //公用函数:隐藏下拉选择框。 调用此函数前,需要为blurFlag赋值为true.参数:测试用,用来打印出在哪里调用的此方法
function hideSelectList(str) {
//console.log("str:" + str + ",blurFlag:" + blurFlag);
if (!blurFlag) return;
if (selectList.css("display") == "none") return;
selectList.hide();
var inputValue = input.val();
//判断输入的文字是否在下拉选择中存在
var options = sel.find("option");
var inputValidFlag = false; for (var i = 0; i < options.length; i++) {
if ($(options[i]).text() == inputValue) {
//input中的值在下拉框中是存在的,给下拉框、原始Select置选中的options,为input赋值
inputValidFlag = true;
//selectList[0].selectedIndex = i;
selectList.find("option").removeAttr("selected");
selectList.find("option[value='" + $(options[i]).val() + "']").attr("selected", "selected"); //将下拉框选中输入的项
selectList[0].selectedIndex = selectList.find("option[value='" + $(options[i]).val() + "']")[0].index;
sel[0].selectedIndex = i;
//sel.find("option").removeAttr("selected");
//sel.find("option[value='" + $(options[i]).val() + "']").attr("selected", "selected"); //将原始select选中输入的项
//给输入框input赋值
//input.val(selectList.find("option:selected").text());
input.data("selectValue", selectList.val());
break;
}
}
//input中的值在下拉框中不存在:input显示默认值emptyText,并把下拉框中恢复显示所有option
if (!inputValidFlag) {
input.val(emptyText);
quickFilter("");
selectList.find("option").removeAttr("selected");
sel.find("option").removeAttr("selected");
}
} //公用函数:在input中输入时过滤select中的option. 参数:input中输入的文字
function quickFilter(val) {
if (val.length == 0 || val == emptyText) {
selectList.html(sel.html());
return;
}
//算法:一个字一个字的比较,比较笨,如果有更好的办法可以修改
var arr = new Array();
for (var i = 0; i < val.length; i++) {
arr[i] = val.substr(i, 1);
}
var options = sel.find("option");
selectList.empty();
for (var i = 0; i < options.length; i++) {
var filterFlag = true;
for (var j = 0; j < arr.length; j++) {
if ($(options[i]).text().indexOf(arr[j]) < 0) {
filterFlag = false;
}
if (filterFlag == false) break;
}
if (filterFlag) selectList.append($($("<div></div>").append($(options[i]).clone()).html()));//当前option包含了input输入的文字,将option加入到下拉框中
}
}
}
})(jQuery);
另外JQuery也有一款插件可以实现jquery.flexselect.js。
自己写的select元素可编辑、可筛选JQuery插件 jquery.inputselectbox.js的更多相关文章
- 写了个限制文本框输入最大长度的jquery插件 - jquery.restrictFieldLength.js
做了个限制文本框最大输入长度的jquery插件,效果图(共2个文本框,限制最多10个字符): 功能:当超出设置的最大字符长度后,会截断字符串.更改当前元素的css(会在1秒后还原css).支持长度超出 ...
- 获取表单内的所有元素的值 表单格式化插件jquery.serializeJSON
简单描述:一个form表单里有十几个input或者select,要获取到他们的值,我的做法一直都是$("#id").val();这样做本来没什么说的,但是如果有很多呢,就很麻烦,看 ...
- 自己写jquery插件之模版插件高级篇(一)
需求场景 最近项目改版中,发现很多地方有这样一个操作(见下图gif动画演示),很多地方都有用到.这里不讨论它的用户体验怎么样. 仅仅是从复用的角度,如果每个页面都去写text和select元素,两个b ...
- jquery的select元素和option的相关操作
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 关于select元素的一些基本知识
为select元素绑定值的几个方法: 一.通过字符串拼接,让后追加到select元素下, 二.通过DOM创建option元素,为其绑上value值和文本: function loadProvinve( ...
- Mybatis --- 映射文件、参数处理、参数值的获取、select元素
映射文件:指导着MyBatis如何进行数据库增删改查, 有着非常重要的意义: - cache 命名空间的二级缓存配置 - cache-ref 其他命名空间缓存配置的引用. - result ...
- javascript操作select元素一例
熟悉一下js对select元素的操作,html页面中建立一个form,其中包含一个select元素和submit按钮. 当选择select中某一项时改变其文字,当select中所有项的文字都改变后,重 ...
- jQuery为动态生成的select元素添加事件的方法
项目中需要在点击按钮时动态生成select元素,为防止每次点击按钮时从服务器端获取数据(因为数据都是相同的),可以这样写代码 1.首先定义全局js变量 var strVoucherGroupSelec ...
- 使用JavaScript获取select元素选中的value和text
示例代码如下(js直接写在了html里面,没有写在一个单独的外部文件中): <!DOCTYPE html> <html> <head> <meta name= ...
随机推荐
- log4j.properties 的使用详解
一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUGERROR 为严重错误 主要是程序的错误WARN 为一般警告,比如session丢失IN ...
- android 知识点
版本更新 数据库Relam 图片加载库 视频bilibili 幻灯片 网络请求框架 内存检测工具 内存优化总结 压缩包下载并且解压 新闻资讯导航 联系人 滑动退出activity mvp框架 加载进度 ...
- 扩展kmp——原创
扩展kmp LRH 所谓扩展kmp指的是与kmp相似的求辅助数组的原理,但是本身与kmp关系不大. 1.exkmp的用途:给定一个主串s和一个子串t,求出s中每一个后缀 ...
- 第三节,入门知识和windows系统安装python环境
1.使用Linux的好处(稳定)不容易死机,可以长达几年不间断运行(安全)相对windows系统更安全,相对更不容受到各种攻击(开源)免费使用2.安装好虚拟机VMware软件,和Linux系统,以及X ...
- JavaScript 运动框架 Step by step(转)
1,运动原理 Js运动,本质来说,就是让 web 上 DOM 元素动起来.而想要 DOM 动起来,改变其自身的位置属性,比如高宽,左边距,上边距,透明度等.动画的原理就是把不同状态的物体,串成连续的样 ...
- JS复习:第十、十一章
第十章 NodeList是一种类数组对象,用于保存一组有序的节点,可以通过位置来访问这些节点,但它并不是Array实例,将其转化为数组的方法: function converToArray(nodes ...
- 后台验证url是不是有效的链接
/** * 判断链接是否有效 * 输入链接 * 返回true或者false */ public static boolean isValid(String strLink){ URL url=null ...
- 转Rollback后undo到底做了些什么?
转自:http://biancheng.dnbcw.info/oracle/309191.html Rollback后undo到底做了些什么? 从概念上讲,undo正好与redo相对.当你对数据执行修 ...
- 局域网iis添加主机头
局域网上用主机头访问不像外网,直接设置主机头就行了, 在局域网设置了主机头还要修改host文件 打开host快捷的方法: win7在win+r运行里面运行C:\Windows\System32\dri ...
- 设计模式4 外观模式 FACADE
一个外观是一个类,其提供的功能介于工具箱的功能和完整系统的功能之间,并为一个包或者一个子系统中的类提供了简化的使用方式.