关于jquery动态增减控件的一些想法和小插件


Posted in Javascript onAugust 01, 2010

去年做项目时遇到一个模块,需要能够动态的增减控件。当初第一个解决方案是用UpdatePanel做页面的局部更新。由于页面很大,而且控件非常多,当动态增加的控件非常多的时候,会变得很慢。后来就想着用javascript做动态的增减控件,最后在提交页面的时候搜集页面控件的数据,效果很棒,但是由于当时仅仅是为那一个模块做,所以扩展性很差,而且那时写javascript代码非常复杂,仅仅为了动态增减的效果,就写超过了500行javascript代码。

后来去年末时间空闲下来的时候重写了这段代码,现在这段代码压缩到100行内,而且扩展方便,可以非常轻松的增减控件的数量,使用非常简单。

效果图:
关于jquery动态增减控件的一些想法和小插件
一个简单的例子:

<?xml version="1.0" encoding="iso-8859-1"?> 
<html> 
<head> 
<title></title> 
<script language="javascript" src="jquery-1.4.2.min.js"></script> 
<script language="javascript" src="dynamicAddRemover.js"></script> 
<script language="javascript"> 
$(function(){ 
$("table").dynamicAddRemover(); 
}); 
</script> 
</head> 
<body> 
<table> 
<tr> 
<td> 
<select> 
<option value ="volvo">Volvo</option> 
<option value ="saab">Saab</option> 
<option value="opel">Opel</option> 
<option value="audi">Audi</option> 
</select> 
<input type="text" name="text1" id="text1" value="Text"></input> 
<button type="button" name="btn1" value="btn1" id="btn1" >Button</button> 
</td> 
</tr> 
</table> 
</body> 
</html>

加了限制个数事件后的例子:
<?xml version="1.0" encoding="iso-8859-1"?> 
<html> 
<head> 
<title></title> 
<script language="javascript" src="jquery-1.4.2.min.js"></script> 
<script language="javascript" src="dynamicAddRemover.js"></script> 
<script language="javascript"> $(function(){ 
$("#table1").dynamicAddRemover({ 
addedEvent:function(newCtl, options){ 
//clear the textbox. 
newCtl.find(":text").val(''); 
if($("table").size() > 5) 
{ 
//hide the add button. 
newCtl.find("img[id$='" + options.adderId + "']").hide(); 
} 
}, 
removedEvent:function(prevCtl, nextCtl, options){ 
if($("table").size() <= 5) 
{ 
//show the add button. 
$("table:last").find("img[id$='" + options.adderId + "']").show(); 
} 
} 
}); 
}); 
</script> 
</head> 
<body> 
<table id='table1'> 
<tr> 
<td> 
<select> 
<option value ="volvo">Volvo</option> 
<option value ="saab">Saab</option> 
<option value="opel">Opel</option> 
<option value="audi">Audi</option> 
</select> 
<input type="text" name="text1" id="text1" value="Text"></input> 
<button type="button" name="btn1" value="btn1" id="btn1" >Button</button> 
</td> 
</tr> 
</table> 
</body> 
</html>

参数的定义:
rootWrapper default: "table" 
根容器,就是需要增减的控件的根容器,目前代码上仅仅支持table根容器。 
adderId default:"imgExpBtn" 
增加按钮的Id。 
removerId default:"imgColBtn" 
删除按钮的Id。 
addingEvent default:null 
在增加事件之前所触发的自定义事件,参数为newWrapper和options, newWrapper为新增的控件的父容器,options为参数列表自己。 
addedEvent default:null 
在增加事件之后所触发的自定义事件,参数为newWrapper和options, newWrapper为新增的控件的父容器,options为参数列表自己。 
removingEvent default:null 
在删除事件之前所触发的自定义事件,参数为refWrapper和options, reWrapper为被删除的控件的父容器,options为参数列表自己。 
removedEvent default:null 
在删除事件之后所触发的自定义事件,参数为prevWrapper,nextWrapper和options, prevWrapper为被删除的父容器的上一个容器,nextWrapper为被删除的父容器的下一个容器,,options为参数列表自己。 
collapseImgUrl default:'icon_collapse.gif' 
增加按钮的路径 
expandImgUrl default:'icon_expand.gif' 
删除按钮的路径

注意事项:
.可以添加在增减过程中需要的自定义参数和变量,如: $("table").dynamicAddRemover({param1:"param1", param2:"param2"});
使用时,如:options.param1等等。
.根容器必须有唯一Id且指定时必须唯一。如果有多个模块(多个根容器)需要使用可以这样:$("#table1").dynamicAddRemover(),$("#table2").dynamicAddRemover()等等。
.新添加的控件里的Id和name并没有更新,如果有特别业务需要,请在addedEvent里添加生成新Id的业务逻辑。
.本插件需要Jquery 1.2.6版本以上支持。

源代码和原理很简单,仅仅作为一个抛砖引玉的作用。以下是包括源代码的附件。
dynamicAddRemover.rar

Javascript 相关文章推荐
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
Mar 24 Javascript
网页实时显示服务器时间和javscript自运行时钟
Jun 09 Javascript
javascript模拟实现ajax加载框实例
Oct 15 Javascript
JS实现网页标题随机显示名人名言的方法
Nov 03 Javascript
Javascript中document.referrer隐藏来源的方法
Jan 16 Javascript
Angular 4环境准备与Angular cli创建项目详解
May 27 Javascript
echarts设置图例颜色和地图底色的方法实例
Aug 01 Javascript
简单了解微信小程序 e.target与e.currentTarget的不同
Sep 27 Javascript
Vue3.0中的monorepo管理模式的实现
Oct 14 Javascript
Vue移动端实现图片上传及超过1M压缩上传
Dec 23 Javascript
JavaScript实现旋转木马轮播图
Mar 16 Javascript
vue实现页面切换滑动效果
Jun 29 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
Aug 01 #Javascript
jQuery的实现原理的模拟代码 -1 核心部分
Aug 01 #Javascript
jQuery validate 中文API 附validate.js中文api手册
Jul 31 #Javascript
jQuery对象[0]是什么含义?
Jul 31 #Javascript
动态调用CSS文件的JS代码
Jul 29 #Javascript
date.parse在IE和FF中的区别
Jul 29 #Javascript
iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过
Jul 29 #Javascript
You might like
php使用MySQL保存session会话的方法
2015/06/26 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
js内置对象 学习笔记
2011/08/01 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
浅谈js中function的参数默认值
2017/02/20 Javascript
js实现省市级联效果分享
2017/08/10 Javascript
移动端手指操控左右滑动的菜单
2019/09/08 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
vue自定义指令实现仅支持输入数字和浮点型的示例
2019/10/30 Javascript
基于脚手架创建Vue项目实现步骤详解
2020/08/03 Javascript
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
[05:03]2018DOTA2亚洲邀请赛主赛事首日回顾
2018/04/04 DOTA
py2exe 编译ico图标的代码
2013/03/08 Python
Python 正则表达式的高级用法
2016/12/04 Python
Python OpenCV获取视频的方法
2018/02/28 Python
Django rest framework实现分页的示例
2018/05/24 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
2020/02/18 Python
django下创建多个app并设置urls方法
2020/08/02 Python
Python tkinter实现日期选择器
2021/02/22 Python
HTML5在canvas中绘制复杂形状附效果截图
2014/06/23 HTML / CSS
希尔顿酒店官方网站:Hilton Hotels
2017/06/01 全球购物
RUIFIER官网:英国奢侈高级珠宝品牌
2020/06/12 全球购物
.NET初级开发工程师面试题(包括Javascript)
2012/08/22 面试题
毕业生求职简历的自我评价
2013/10/23 职场文书
职专应届生求职信
2013/11/16 职场文书
股权转让意向书
2014/04/01 职场文书
老龄工作先进事迹
2014/08/15 职场文书
珍惜资源的建议书
2014/08/26 职场文书