我的第一个jquery插件:下拉多选框
<!DOCTYPE HTML>
<html>
<head>
<title> New Document </title>
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
<!--
(function ($) {
$.fn.zMultiSelect = function (zSetting, zData) {
//默认设置
var defaultVal = {
json : true,//是否通过json对象导入选项
hasHidden : false,//是否需要隐藏域
hiddenName : "",//隐藏域的name的值
hasAllChecked : true,//是否需要添加全选选项
textSeparator : ";",//文本框中的连接符
valueSeparator : ";"//隐藏域中的连接符
};
//将用户设置与默认设置合并
var setting = $.extend(true,{}, defaultVal, zSetting);
//遍历jquery对象,并返回该jquery对象
return this.each(function () {
var $this = $(this);//当前dom封装成jquery对象
var objId = $this.attr("id");//当前对象的id,也可用this.id来获取
var spanId = objId+"_span";//添加_span后缀做为悬浮框的id
//为当前对象绑定单击事件,先隐藏所有悬浮框,然后显示当前对象关联的悬浮框,并阻断事件继续传播
$this.bind('click',function(e){
$("span[id$=_span]").hide();
$("#"+spanId).show();
e.stopPropagation();//阻断事件传播
});
if(setting.json){
//如果设置json为true,则按设置载入数据,对象前后添加隐藏域和悬浮框
loadJson($this,setting,zData);
}
//为当前对象关联的多选框添加单击事件
$("[class=" + objId + "]:checkbox").bind("click",function(e){
//如果为全选复选框,则相应全选,全不选,相关选项
if(this.value==""){
if(this.checked){
$("[class=" + objId + "]:checkbox").attr("checked", true);
}else {
$("[class=" + objId + "]:checkbox").attr("checked", false);
}
}
//将已选项的值连接起来赋值给文本框和隐藏域
onchangeCheckState($this,setting);
});
//阻止span及其子元素的单击事件传播到document
$("#"+spanId).bind('click',function(e){
e.stopPropagation();//阻断事件传播
});
//单击document时,隐藏所有悬浮框
$(document).bind('click',function(){
$("span[id$=_span]").hide();
});
})
};
//添加悬浮框及隐藏域
function loadJson(obj,setting,zData){
var hasHidden = setting.hasHidden;
var objId = obj.attr("id");
var spanId = objId+"_span";
//--------------------拼接悬浮框span-----------------------------------------------------------
var spanAdd = '<span id="'+spanId+'">';
if(setting.hasAllChecked){
//添加全选选项
spanAdd += '<div cellpadding="0" cellspacing="0" style="width:100%;border-style: none none solid none;border-color:gray;border-width:1px;"><input type="checkbox" id="'+objId + '_all' +'" class="'+objId+'" value=""/>';
spanAdd += '<label for="' + objId + '_all' + '">全选</label></div>';
}
for(var item in zData){
//多选框id,有隐藏域时,为文本框id+_+json对象的属性名,没有隐藏域时,为文本框id+_+json对象的属性值
var checkboxId = (hasHidden) ? (objId + '_' + item) : (objId + '_' + zData[item]);
//多选框的value,根据hasHidden设置为属性名或属性值
var checkboxValue = (hasHidden) ? item : zData[item];
//添加各选项
spanAdd += '<input type="checkbox" id="'+checkboxId+'" class="'+objId+'" value="'+checkboxValue+'"/>';
spanAdd += '<label for="'+checkboxId+'">'+zData[item]+'</label><br>';
}
spanAdd += '</span>';
//--------------------拼接span结束-----------------------------------------------------------
//添加悬浮框
obj.after($(spanAdd));
//为悬浮框添加class设置样式,并隐藏,同时添加mouseover和mouseout事件
$("#"+spanId).addClass("spanFloater").hide().hover(
function(){ $(this).show(); },
function(){ $(this).hide(); }
);
//添加隐藏域
if(hasHidden){
var hiddenId = objId+"_value";//添加_value后缀做为隐藏域的id
var hiddenAdd = '<input type="hidden" id="'+hiddenId+'" name="'+setting.hiddenName+'">';
obj.before($(hiddenAdd));
}
};
//单击复选框事件,为文本框和隐藏域赋值
function onchangeCheckState(obj,setting){
var objId = obj.attr("id");
var hiddenId = objId+"_value";
var kArr = new Array();
var vArr = new Array();
//获取已选项的值,赋值给数组
$("input[class=" + objId + "][value!='']:checked").each(function (index) {
kArr[index] = this.value;
vArr[index] = $(this).next().text();
});
//串联数组,赋值给文本框和隐藏域
if(setting.hasHidden){
$("#"+hiddenId).val(kArr.join(setting.valueSeparator));
}
obj.val(vArr.join(setting.textSeparator));
}
})(jQuery);
$(document).ready(function () {
var setting = {json:true,hasHidden:true,hiddenName:"dict_dim_Level",textSeparator:",",valueSeparator:"-"}
var data = {nanjing:"南京",shanghai:"上海",yangzhou:"扬州",suzhou:"苏州",wuxi:"无锡",changzhou:"常州",yancheng:"盐城",xuzhou:"徐州",taizhou:"泰州",huaian:"淮安"};
$("input").zMultiSelect(setting,data).attr("readonly","readonly");
});
//-->
</script>
<style type="text/css">
.spanFloater{display:block;width:inherit;position: absolute; z-index:10;background:#F0F6E4;border: 1px solid #617775;}
#dim_Level {width:150px}
#dim_Level+span {width:155px}
#dim_Level2 {width:150px}
#dim_Level2+span {width:155px;background:lightgreen;border: 1px solid #617775;font-family: 方正舒体;font-size:25px;}
</style>
</head>
<body>
<table>
<tr>
<td>已覆盖城市:</td>
<td><div><input type="text" id="dim_Level"></div></td>
<td>欲拓展城市:</td>
<td><div><input type="text" id="dim_Level2"></div></td>
</tr>
</table>
</body>
</html>
第一次写jquery插件,有很多粗陋的地方,希望路过的朋友能够指点一二
注:easy ui 中已经有了这样的下拉多选框
我的第一个jquery插件:下拉多选框的更多相关文章
- 使用jQuery为文本框、单选框、多选框、下拉框、下拉多选框设值及返回值的处理
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- 品优购商城项目(二)AngularJS、自动代码生成器、select2下拉多选框
品优购商城想项目第二阶段 AngularJS.自动代码生成器.select2下拉多选框 完成了课程第三天.第四天的的任务. 1.学习了AngularJs前端的mvc分层思想,js部分分成control ...
- angular2.x 下拉多选框选择组件
angular2.x - 5.x 的下拉多选框选择组件 ng2 -- ng5.最近在学angular4,经常在交流群看见很多人问 下拉多选怎么做... 今天就随便写的个. 组件源码 百度云 链接: ...
- 自己用ul模拟实现下拉多选框,
模拟实现下拉多选框 效果如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- 自定义实现 PyQt5 下拉复选框 ComboCheckBox
一.前言 由于最近的项目需要具有复选功能,但过多的复选框会影响界面布局和美观,因而想到把 PyQt5 的下拉列表和复选框结合起来,但在 PyQt5 中并没有这样的组件供我们使用,所以想要自己实现一个下 ...
- jquery--获取多选框的值、获取下拉多选框的值
获取多选框的值 var packageCodeList=new Array(); $('#server_id:checked').each(function(){ packageCodeList.pu ...
- jQuery插件——下拉选择框
其实,之前也写过jQuery插件,今天写的是一个模拟select选择的下拉插件. 既然是jQuery插件,那么必然是依赖jQuery的了. 老规矩,直接上代码吧! ;(function () { $. ...
- ios一个自定义的下拉多选菜单
前段时间项目刚好要做到条件筛选菜单,正好找到一些别人写的,结合自己实际需求进行优化修改,一个实用的多条件筛选菜单,根据其他的下拉进行一些改进. 点击后返回点击文字显示 github地址:https:/ ...
- selectpicker下拉多选框ajax异步或者提前赋值=》默认值
Bootstrap select多选下拉框赋值 success: function (data) { var oldnumber = new Array(); $.each(data, functio ...
随机推荐
- SQLserver利用系统时间生成“2015-11-30 00:00:00.000”类型的时间
select getdate() ---当前时间:2015-12-18 10:20:24.097 -------------------建立测试表 Create Table #Test ( ID IN ...
- 设置NODE_ENV=production
NodeJS - Express 4.0下设置环境变量NODE_ENV=production,并不是修改文件的配置信息,而是通过命令行来实现. 首先在命令行下进入项目的目录,然后先后执行如下命令: s ...
- 虚拟机备份转移后,网络启动异常,提示“SIOCSIFADDR: No such device”的解决方案
虚拟机管理软件:Oracle VirturalBox Manager 4.0.8 虚拟机:Ubuntu Server 10.10 i386 The problem lies in the fact t ...
- 处理一则MySQL Slave环境出现ERROR 1201 (HY000): Could not initialize master info structure的案例
mysql> start slave; ERROR (HY000): Slave failed to initialize relay log info structure from the r ...
- pos机套现是怎么回事
POS机是商家为了促进消费,向银行申请的刷卡机它的主要功能是转账就是通过客户的刷卡,把相对的金额转入商户的帐户银行会根据笔数或金额向商户收取手续费非法套现就是客户并未和商户产生贸易往来,单纯通过pos ...
- ASP.NET MVC 中CSS JS压缩合并 功能的使用方法
通过压缩合并js文件和css文件,可以减少 服务器的响应 次数和 流量,可以大大减小服务器的压力,对网站优化有比较明显的帮助!压缩合并 css 文件和js文件是网站优化的一个 比较常用的方法. ASP ...
- .htaccess文件讲解
.htaccess文件(或者"分布式配置文件")提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录.作为用户 ...
- Guava文档翻译之 Service
概览 Guava的接口代表了一个有运行状态的对象,有启动和停止的方法.比如网络服务器,RPC服务器,以及计时器等,都可以实现Service接口.掌管像这样的服务的状态,需要正确地管理启动和关闭,因此会 ...
- 请求--拦截器--action经过
引用我这里想知道的是同名的多个参数,会被自动的放置在List或者数组中,我想知道是怎么实现的,因为取一个参数和取多个同名的参数是不同的方法: 一个是request.getParameter 一个是re ...
- Android开发--使用真机进行USB调试程序
在android小程序的开发过程中,使用eclipse中的虚拟机进行程序开发速度较慢,用真机开发可以显著提高调试的速度. 这里我用的操作系统是win7专业版,手机型号HM1S: 进行USB调试的主要步 ...