<!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插件:下拉多选框的更多相关文章

  1. 使用jQuery为文本框、单选框、多选框、下拉框、下拉多选框设值及返回值的处理

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  2. 品优购商城项目(二)AngularJS、自动代码生成器、select2下拉多选框

    品优购商城想项目第二阶段 AngularJS.自动代码生成器.select2下拉多选框 完成了课程第三天.第四天的的任务. 1.学习了AngularJs前端的mvc分层思想,js部分分成control ...

  3. angular2.x 下拉多选框选择组件

    angular2.x - 5.x 的下拉多选框选择组件 ng2 -- ng5.最近在学angular4,经常在交流群看见很多人问 下拉多选怎么做... 今天就随便写的个. 组件源码 百度云   链接: ...

  4. 自己用ul模拟实现下拉多选框,

    模拟实现下拉多选框 效果如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  5. 自定义实现 PyQt5 下拉复选框 ComboCheckBox

    一.前言 由于最近的项目需要具有复选功能,但过多的复选框会影响界面布局和美观,因而想到把 PyQt5 的下拉列表和复选框结合起来,但在 PyQt5 中并没有这样的组件供我们使用,所以想要自己实现一个下 ...

  6. jquery--获取多选框的值、获取下拉多选框的值

    获取多选框的值 var packageCodeList=new Array(); $('#server_id:checked').each(function(){ packageCodeList.pu ...

  7. jQuery插件——下拉选择框

    其实,之前也写过jQuery插件,今天写的是一个模拟select选择的下拉插件. 既然是jQuery插件,那么必然是依赖jQuery的了. 老规矩,直接上代码吧! ;(function () { $. ...

  8. ios一个自定义的下拉多选菜单

    前段时间项目刚好要做到条件筛选菜单,正好找到一些别人写的,结合自己实际需求进行优化修改,一个实用的多条件筛选菜单,根据其他的下拉进行一些改进. 点击后返回点击文字显示 github地址:https:/ ...

  9. selectpicker下拉多选框ajax异步或者提前赋值=》默认值

    Bootstrap select多选下拉框赋值 success: function (data) { var oldnumber = new Array(); $.each(data, functio ...

随机推荐

  1. openwrt无线中继教程

    1.设置自己路由lan口的IP地址,网段不能跟上级路由的一样. 2.在无线标签下点击"扫描网络". 3.在新出现的界面中,会列出你附近的无线网络.点击你需要中继的网络右边的&quo ...

  2. Linux之mount命令详解

    linux下挂载(mount)光盘映像文档.移动硬盘.U盘.Windows和NFS网络共享linux是个优秀的开放源码的操作系统,能够运行在大到巨型小到掌上型各类电脑系统上,随着linux系统的日渐成 ...

  3. 【js】 流式布局 页面

    <!DOCTYPE html><html><head> <meta content="text/html; charset=utf-8" ...

  4. Window.ActiveXObject的用法 以及如何判断浏览器的类型

    (window.ActiveXObject) 什么意思? 解:判断浏览器是否支持ActiveX控件,如果浏览器支持ActiveX控件可以利用 var xml=new ActiveXObject(&qu ...

  5. UML 小结(3)- UML的结构及各个阶段的应用

    UML的结构: 其中各个图的作用如下:     用例图:用来描述用户的需求,从用户的角度描述系统的功能,并指出各功能的执行者,强调谁在使用系统,系统为执行者完成哪些功能. 静态图包括类图跟对象图 类图 ...

  6. centos wordpress

    How To Install Linux, nginx, MySQL, PHP (LEMP) stack on CentOS 6 https://www.digitalocean.com/commun ...

  7. LintCode-Kth Prime Number.

    Design an algorithm to find the kth number such that the only prime factors are 3, 5, and 7. The eli ...

  8. 10.31Daily Scrum

    人员 任务分配完成情况 明天任务分配 王皓南 主网页的框架搭建,任务编号752 研究代码,学习相应语言,讨论设计思路 申开亮 学习数据库的操作,任务编号753 研究代码,学习相应语言,讨论设计思路 王 ...

  9. RabbitMQ学习(1):安装

    1.安装 Erlang,官网:https://www.erlang.org/ 2.安装RabbitMQ服务器,rabbitMQ server,官网http://www.rabbitmq.com/ 注: ...

  10. Consumer Client Re-Design (翻译)

    注:0.9版本Kafka的一个重大改变就是consumer和producer API的重新设计. 这篇Kafka的文档大致介绍了对于consumer API重新设计时想要实现的功能.0.9版本的确实现 ...