本文来之于:http://blog.csdn.net/jetsteven/article/details/5104380#

1、经常用到如下图的选择器,而且要支持排序的,所以萌生用JQUERY写一个。

功能如下:

  • 左右多选,移动。
  • 右边的项可以上下拖动

源代码如下

 /*
name:TwoWay-Select Control for Jquery
author:arn
date:2009-12-29
remark: AJAX URL返回数据必须是json格式{state:1,msg:'',fields:[]}
1、右边可以上下拖动
2、$('#div').twowaylist({url:'',onBeforeSubmit:'',captionColumn''});
3、$('#div').twowaylistinit({field_no:'xx',...});
4、$('#div').twowaylistsubmit({'rptid':$('#txtid').val(),'act':'rpt'}) //AJAX URL用到的参数
*/
(function($){
$.addList = function(t,p)
{
if (t.checkbox) return false; //return if already exist // apply default properties
p = $.extend({
items:[], //ALL ITEMS
captionColumn:'caption', //显示的名称
isgroupColumn:'group', //分组CHECKBOX用到的字段
idColumn:'FIELD_NO', //编号字段
height: , //default height
width: 'auto', //auto width
url: false, //ajax url
method: 'POST', // data sending method
errormsg: 'Connection Error',
title: false,
dataType:'json',
onSuccess: false, // using a custom populate function
onBeforeSubmit: false //提交之前处理事项
}, p); //create twoway-select class
var d = {
json2str:function(json)
{
var isArrObj = $.isArray(json);
var arr = [];
//
for (var key in json)
{
var k = isArrObj? '' : key+":" ; if (typeof json[key] == 'object' && json[key] != null)
arr.push(k + d.json2str(json[key])); //JSON对象
else
arr.push(k + "'" + decodeURIComponent(json[key]) +"'"); //普通值
}
return isArrObj ? '[' + arr.join(',') + ']' : '{' + arr.join(',') + '}';
},
str2json:function(str)
{
return eval('('+str+')');
},
l2r:function(o){ var json = d.str2json($(o).attr('json'));
var chk = document.createElement("input");
//IF GROUP
var chked = json[p.isgroupColumn]==?'checked':'';
$(chk).attr({'type':'checkbox','id':'li'+json[p.idColumn],'checked':chked});
$(o).prepend(chk);
$(d.rdiv).find('ol').append(o);
//change json value,if checkbox state changed
$(o).find("input:checkbox").bind('click',function()
{
if($(this).attr('checked'))
{
json[p.isgroupColumn] = ;
}else{
json[p.isgroupColumn] = ;
}
$(o).attr("json",d.json2str(json));
});
$(d.vinput).val(d.getselected());
},
r2l:function(o){
$(o).find(":checkbox").remove();
$(d.ldiv).find('ol').append(o);
$(d.vinput).val(d.getselected());
},
l2rAll:function(){
$("li", $(d.ldiv).find('ol')).each(function(i,obj){
d.l2r(obj);
});
},
r2lAll:function(){
$("li", $(d.rdiv).find('ol')).each(function(i,obj){
d.r2l(obj);
});
},
getselected:function(){
var result=[]; $(d.rdiv).find('li').each(function(i,obj){
result.push($(this).attr('json'));
});
return result;
},
initData:function(data){
$(d.ldiv).find('ol').empty();
$(d.rdiv).find('ol').empty();
var li;
var lbl;
for (i=;i<data.length;i++){
var li = document.createElement('li');
lbl = document.createElement('label');
if(true)
{
$(lbl).text(data[i][p.idColumn] + ' '+ data[i][p.captionColumn]); //.attr("for",'li' + data[i][p.idColumn])
}else{
$(lbl).text(data[i][p.captionColumn]);
}
$(li).attr('json',d.json2str(data[i])).append(lbl); $(d.ldiv).find('ol').append(li);
}
$(d.ldiv).find('ol li').each(function(i,obj)
{
$(obj).bind('dblclick',function()
{
if($(this).parent().hasClass('twowaylist-lol'))
{
d.l2r(this);
}else{
d.r2l(this);
}
}).bind('click',function()
{
$(this).toggleClass("ui-selected");
});
}); },
ajaxSubmit:function(para){
if(p.url){ if(p.onBeforeSubmit) para= p.onBeforeSubmit();
$.ajax({
type: p.method,
timeout: * ,
url: p.url,
async:false,
data: para,
dataType: p.dataType,
success: function(data){
if(data.state == )
{
$(d.caption).html('');
d.initData(data.fields);
if(p.onSuccess) //执行成功后
{
p.onSuccess();
}
}else{
$(d.caption).html('数据加载失败<br/>' + data.msg );
}
},
error: function(data) { try { alert(data.toString()) } catch (e) {} },
beforeSend:function(data) { },
complete :function(){ }
});
} }
}; if(p.width == 'auto')
{
p.width = ;
}
var mdivwidth = ;
//init div
d.aDiv = document.createElement('div'); d.ldiv = document.createElement('div');
$(d.ldiv).addClass('twowaylist-oldiv').width((p.width - mdivwidth) / ).height(p.height); d.rdiv = document.createElement('div');
$(d.rdiv).addClass('twowaylist-oldiv').width((p.width - mdivwidth) / ).height(p.height); d.mdiv = document.createElement('div');
$(d.mdiv).width(mdivwidth); d.mTable = document.createElement('table');
d.mTable.cellPadding = ;
d.mTable.cellSpacing = ; //add button
var br="<br />";
//l2r
var btnDiv = document.createElement('input');
$(btnDiv).addClass('twowaylist-button').attr({'type':'button','value':'>'}); $(btnDiv).click(
function()
{
$('.ui-selected', d.ldiv).each(function()
{
d.l2r(this);
});
}
);
$(d.mdiv).append(btnDiv);
$(d.mdiv).append(br);
//r2l
btnDiv = document.createElement('input');
$(btnDiv).addClass('twowaylist-button').attr({'type':'button','value':'<'});
$(btnDiv).click(
function()
{
$('.ui-selected', d.rdiv).each(function()
{
d.r2l(this);
});
}
);
$(d.mdiv).append(btnDiv);
$(d.mdiv).append(br);
//l2r all
btnDiv = document.createElement('input');
$(btnDiv).attr({'type':'button','value':'>>'}).addClass('twowaylist-button');
$(btnDiv).click(
function()
{
d.l2rAll();
}
);
$(d.mdiv).append(btnDiv);
$(d.mdiv).append(br);
//r2l all
btnDiv = document.createElement('input');
$(btnDiv).attr({'type':'button','value':'<<'}).addClass('twowaylist-button');
$(btnDiv).click(
function()
{
d.r2lAll();
}
);
$(d.mdiv).append(btnDiv);
$('span',d.mdiv)
.css({paddingLeft:})
; //set div
d.caption = document.createElement("caption");
$(d.mTable).append(d.caption);
//set table th
var thead = document.createElement("thead");
var tr = document.createElement("tr");
var th=document.createElement("th");
$(th).html('待选项');
$(tr).append(th);
th=document.createElement("th");
$(tr).append(th);
th=document.createElement("th");
$(th).html('已选项');
$(tr).append(th);
$(thead).append(tr);
$(d.mTable).append(thead);
var tbody = document.createElement("tbody"); tr = document.createElement("tr"); var td = document.createElement("td");
var lol= document.createElement("ol");
$(lol).addClass('twowaylist-lol');
$(d.ldiv).append(lol); $(td).append(d.ldiv);
$(tr).append(td);
td = document.createElement("td");
$(td).append(d.mdiv);
$(tr).append(td);
td = document.createElement("td"); var rol= document.createElement("ol");
$(rol).addClass("twowaylist-rol");
$(d.rdiv).append(rol);
$(td).append(d.rdiv);
$(tr).append(td); $(tbody).append(tr);
$(d.mTable).append(tbody);
$(t).append(d.mTable); d.vinput = document.createElement("input");
$(d.vinput).attr({'type':'hidden','id':'twowaylistValue'});
$(t).append(d.vinput);
//leftlist selectable
//$(lol).selectable();
//rightlist sortable
$(rol).sortable(); t.list = d;
//load items
if(p.items)
{
d.initData(p.items);
}
return t;
}; var docloaded = false;
$(document).ready(function () {docloaded = true} );
//初始化
$.fn.twowaylist = function(p) {
return this.each( function() {
var t = this;
if (!docloaded)
{
$(this).hide();
$(document).ready
(
function ()
{
$.addList(t,p);
}
);
} else {
$.addList(this,p);
}
});
}; //end twowaylist
//初始化列表,参数为json array
$.fn.twowaylistinit = function(data) {
return this.each(function(){
if(this.list)
{
this.list.initData(data);
}
});
}; //end twowaylistinit
//AJAX提交,获取字段列表,参数如{id:'2'}
$.fn.twowaylistsubmit = function(pa) {
return this.each(function(){
if(this.list)
{
this.list.ajaxSubmit(pa);
}
});
}; //end twowaylistsubmit
})(jQuery);

基于JQUERY写的 LISTBOX 选择器的更多相关文章

  1. 一个基于jQuery写的弹窗效果(附源码)

    最近项目中频繁遇到需要弹出窗口的功能,一直使用浏览器默认的Alert和Confirm弹窗,感觉视觉效果不是那么好,而从网上下载的话又找不到合适的,找到的话有些也是十分臃肿,有时候感觉学习配置的功夫自己 ...

  2. 仿照jQuery写一个关于选择器的框架(带了注释,请多多指教~)

    var select = (function () { //这是一个异常与捕获的代码,它表示的意思是:如果push方法出现了错误那么就需要重写push方法 try { //这边是自己模拟一个场景,来使 ...

  3. 基于jquery开发的UI框架整理分析

    根据调查得知,现在市场中的UI框架差不多40个左右,不知大家都习惯性的用哪个框架,现在市场中有几款UI框架稍微的成熟一些,也是大家比较喜欢的一种UI框架,那应该是jQuery,有部分UI框架都是根据j ...

  4. 基于jQuery带备忘录功能的日期选择器

    今天给大家分享一款基于jQuery带备忘录功能的日期选择器.这款日期控制带有备记忘录功能.有备忘录的日期有一个圆圈,单击圆圈显示备忘录.该实例适用浏览器:360.FireFox.Chrome.Safa ...

  5. 基于jQuery的视频和音频播放器jPlayer

    jPlayer见网络上资料很少,官方英文资料太坑爹TAT,于是就写一个手记给大家参考下.据我观察,jPlayer的原理主要是用到HTML5,在不支持HTML5的浏览器上使用SWF.做到全兼容,这一点很 ...

  6. 10款基于jquery的web前端特效及源码下载

    1.jQuery时间轴插件:jQuery Timelinr 这是一款可用于展示历史和计划的时间轴插件,尤其比较适合一些网站展示发展历程.大事件等场景.该插件基于jQuery,可以滑动切换.水平和垂直滚 ...

  7. 基于jQuery查找dom的多种方式性能问题

    这个问题的产生由于我们前端组每个人的编码习惯的差异,最主要的还是因为代码的维护性问题.在此基础上,我对jQuery源码(1.11.3)查找dom节点相关的内容进行了仔细的查阅,虽然并不能理解的很深入 ...

  8. 基于jquery的城市选择插件

    城市选择插件的难度不是很大,主要是对dom节点的操作.而我写的这个插件相对功能比较简答,没有加入省市联动. 上代码好了,参照代码的注释应该比较好理解. /* *基于jquery的城市选择插件 *aut ...

  9. 基于jquery的插件开发

    最近在公司做一个项目,由于后台数据太多需要分页显示,在网上找了很多插件都没有找到合适的分页插件,所有的分页插件始终达不到自己想要的效果.由于这个项目也不是很赶,就在网上查找各种资料,自己写一个基于jq ...

随机推荐

  1. css部分总结

    10.19HTML总结 1.<!DOCTYPE HTML>声明:告知浏览器文档使用哪种HTML或者XHTML规范,该标签可声明三种DTD(文档类型定义)类型:严格版本.过渡版本以及基于框架 ...

  2. 《第一行代码》学习笔记39-服务Service(6)

    1.Android中定时任务一般有两种实现方式:(1)使用Java API里提供的Timer类:(2)使用Android的Alarm机制. 但是,Timer类有个明显的短板,不太适用于那些需要长期在后 ...

  3. JAVA中this用法小结[转]

    Java关键字this只能用于方法方法体内.当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this.因此,this只能在类中的非静态方法中使用,静 ...

  4. Linux方面收藏的一点儿资料

    初来乍到,也算是第一次写技术类相关的博客,就分享几篇收藏的Linux相关的资料吧,希望可以给需要的人一点帮助. 1.<高级Bash脚本编程指南>:该网站详细讲解了Bash Shell编程的 ...

  5. 一品楼论坛www.ep6.info一品楼论坛

    一品楼论坛最新地址www.ep6.info>访问一品楼网站. 一品楼是现在比较大的信息分享平台,一品楼上网必进. 一品楼江苏版块,一品楼北京版块,一品楼怡红院,一品楼怡春院. 一品楼山东信息. ...

  6. (转)Oracle Data Guard学习

    一.Data Guard提供如下三种数据保护模式: 1)最高保护模式(Maximum Protection) 这里的”最高保护“是指最大限度的保护数据不丢失,也就是至少有一个standby和prima ...

  7. 关于NotePad++ v1.0的编译和源码分析

    最近想读读开源项目,windows下的.文本编辑器是一个很好的选择,因为里面的很多技术,算法(字符串搜索,匹配等)都是被程序员实现过千万遍了,代码里面有很多精髓可以让我们这些菜鸟学学. 首先:下载源码 ...

  8. MySQL的SQL_CALC_FOUND_ROWS真的很慢么?

    分页程序一般由两条SQL组成: SELECT COUNT(*) FROM ... WHERE .... SELECT ... FROM ... WHERE LIMIT ... 如果使用SQL_CALC ...

  9. Mysql unix_timestamp() FROM_UNIXTIME和DATE_FORMAT(date,format)

    mysql 中:UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date) 若无参数调用,则返回一个 Unix timestamp ('1970-01-01 00:00:00' GM ...

  10. mysql sql优化<1>

    <pre name="code" class="html">explain SELECT t.* FROM ( SELECT t1.sn AS cl ...