本文来之于: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. python 下的数据结构与算法---4:线形数据结构,栈,队列,双端队列,列表

    目录: 前言 1:栈 1.1:栈的实现 1.2:栈的应用: 1.2.1:检验数学表达式的括号匹配 1.2.2:将十进制数转化为任意进制 1.2.3:后置表达式的生成及其计算 2:队列 2.1:队列的实 ...

  2. sqlserver获取当前id的前一条数据和后一条数据

    一.条件字段为数值的情况   select * from tb where id=@id; --当前记录   select top 1 * from tb where id>@id order  ...

  3. ReportViewer导出功能筛选

    ReportViewer只能导出Excel,把导出Word和PDF功能去掉 <rsweb:ReportViewer ID="ReportViewer1" runat=&quo ...

  4. php模块memcache和memcached区别分析

    zm总结:尽量使用memcached就好了 1.目前大多数php环境里使用的都是不带d的memcache版本,这个版本出的比较早,是一个原生版本,完全在php框架内开发的.与之对应的带d的memcac ...

  5. android开发架构理解

    1. android 开发和普通的PC程序开发的,我觉得还是不要过度设计,因为手机开发,项目相对传统软件开发就小很多,而且手机的性能有限,过度设计代码mapping需要消耗的能相对就高,而且手机开发的 ...

  6. alter database open resetlogs

    使用resetlogs选项,会把当前的日志序号(log sequence number)重设为1,并抛弃所有日志信息.在以下条件时需要使用resetlogs选项: 在不完全恢复(介质恢复): 使用备份 ...

  7. uva 10609 - Fractal

    题目大意:给出A,B两个点的坐标,以及T,每次找到A.B的四等分点C,D,然后以AB/2为边长,C,D为顶点,构建一个等边三角形,E为另外一个顶点,然后再对C,E:E,D做同样的操作,直到构建的等边三 ...

  8. 自定义 Preference Header 布局

    1. Preference Header 概述: 对于什么是 Preference Header,以及何时使用 Preference Header,请参考我的另一篇博文: 何时使用 Preferenc ...

  9. socket学习及各类错误码(部分转)

    如果本地有多个网卡(即多个ip),要指定本地发送网卡,则在建立的socket上bind所指定的网卡进行connect和send操作.例子程序如下: #include <stdio.h>#i ...

  10. Java学习笔记--String StringBuffer StringBuilder

    String StringBuffer StringBuilder String http://docs.oracle.com/javase/7/docs/api/ 中文: http://www.cn ...