jQ+jQ UI制作的一个简单的二级可多选穿梭框

<!doctype html >
< html lang= "en" >
< head >
< meta charset= "utf-8" >
< meta name= "viewport" content= "width=device-width, initial-scale=1" >
< title >哎呀 </ title >
< link rel= "stylesheet" href= "css/jquery-ui.css" >
<!--<link rel="stylesheet" href="/resources/demos/style.css">-->
< script src= "js/jquery-1.9.1.min.js" > < / script >
< script src= "js/jquery-ui.js" > < / script >

< style >
#feedback { font-size: 1.4em; }
.myul .ui-selecting { background: #FECA40; }
.myul .ui-selected { background: #F39814; color: white; }
.myul { list-style-type: none; margin: 0; padding: 0; width: 60%; }
.myul li { margin: 3px; padding: 0.4em; font-size: 1.4em; height: 18px; margin-left: 20px; }
p{ margin: 3px; padding: 0.4em; font-size: 1.4em; height: 18px;}
.a{
float: left;
width: 400px;
height: auto;
border: 1px solid #ccc;
}
.b{
float: left;
width: 300px;
height: 600px;
margin-left: 80px;
border: 1px solid #ccc;
}
.btn{ width: 50px; height: 30px; margin-top: 10px; cursor: pointer;}
ul,ol,li{ list-style-type: none;}
< / style >

</ head >
< body >

< div class= "box" >

< div class= "a" >
< div class= "first" >
<!--<p class="ui-widget-content">菜单1</p>-->
<!--<ul id="selectable">
<li class="ui-widget-content">Item 1</li>
<li class="ui-widget-content">Item 2</li>
<li class="ui-widget-content">Item 3</li>
<li class="ui-widget-content">Item 4</li>
<li class="ui-widget-content">Item 5</li>
<li class="ui-widget-content">Item 6</li>
</ul>-->
</ div >
</ div >
<!--点击按钮-->
< div class= "btn-bar" style= "width:100px;height:80px;" >
< span id= "add" >< input type= "button" class= "btn" value= ">" /></ span >< br />
< span id= "remove" >< input type= "button" class= "btn" value= "<" /></ span >< br />
</ div >

< div class= "b" >
< div class= "first2" >
<!--<ul id="selectable">

</ul>-->
</ div >
</ div >
   < button onclick= "getData()" >获取当前选中数据 </ button >
</ div >

< script >

//获取被选中的元素 进行打印
function getData(){
   alert( "到控制台查看打印信息")
   console. log(boards);
}

var districts =[{name: '东城区',sID: '1111',sort: 1},{name: '西城区',sID: '1112',sort: 2},{name: '房山区',sID: '1113',sort: 3}],
leftArray = [{name: '东城区',sID: '1111',sort: 1},{name: '西城区',sID: '1112',sort: 2},{name: '房山区',sID: '1113',sort: 3}],
rightArray = [{name: '东城区',sID: '1111',sort: 1},{name: '西城区',sID: '1112',sort: 2},{name: '房山区',sID: '1113',sort: 3}],
selectArray = [{name: '东城区',sID: '1111',sort: 1},{name: '西城区',sID: '1112',sort: 2},{name: '房山区',sID: '1113',sort: 3}];
boards =[];

$. each(leftArray, function( i, j){
j. boards = [];
rightArray[i]. boards = [];
selectArray[i]. boards = [];

for( var k= 0;k< 5+ parseInt( Math. random()* 10);k++)
{
j. boards. push({name: j. name+ '板块'+k,sID:k+ 1,sort:k+ 1,districtId: j. sID});
}
//console.log(selectArray[i].boards)
});

$( function() {
leftArray. forEach( function( item){
$( ".first"). append( ' < p data-sid="'+ item. sID+ '" class=\"ui-widget-content\" >'+ item. name+ ' < /p>');
var $ul = $( ' < ul class="myul" > < /ul>'). appendTo( $( ".first"));
//console.log($ul)

//循环模拟数据
//TODO:筛选出区县下对应板块
$. each( item. boards, function( i, boardItem){
if( boardItem. districtId== item. sID){
var demo = ' < li class="ui-widget-content" data-name="'+ item. name+ '" data-districtid="'+ item. sID+ '" data-boardid="'+ boardItem. sID+ '">'+ boardItem. name+ ' < /li>';
$ul. append(demo);
}
});
});
  
//ul 的绑定事件(jQ UI的多选功能) 这里直接在外边调用这里面的方法。
function bindUlClick(){
//jQuery UI的可选择功能
$( "ul" ). selectable({
stop: function() {
$( ".ui-selected", this ). each( function( i, item) {
var id= $(item). data( 'boardid'),
name = $(item). data( 'name'),
item = {name: item. innerHTML,sID:id};
selectArray. pushItem(name,item);

//这里将选中的selectArray元素,转换成json对象,然后由getData的方法来获取被选中数据
//因为jQ UI的此方法可以获取到被选中元素,因此将被选中元素selectArray在这里进行转换
       boards = JSON. parse( JSON. stringify(selectArray))
});
}
});

//点击菜单显示隐藏
//获取所有的.first里的p和ul
var myP= $( '.first p');
var myUl= $( '.first ul');

for( var i= 0;i< myP. length;i++){
myP[i]. index=i;
//console.log(myP[i].index);
$(myP[i]). click( function(){
//console.log(myUl[this.index]);
$(myUl[ this. index]). toggle();
})
}

//这里还有问题 右边的显示隐藏没有效果(初步估计可能是因为第二个位置不对)
var myP2= $( '.first2 p');
var myUl2= $( '.first2 ul');
for( var i= 0;i< myP2. length;i++){
myP2[i]. index=i;
//console.log(myP2[i].index);
$(myP2[i]). click( function(){
$(myUl2[ this. index]). toggle();
//console.log(myUl2[this.index]);
})
}

}

//调用ul的绑定事件
bindUlClick();


//右侧添加节点 /每次点击add清空右侧html模块,防止重复渲染,并不是很理想的解决方式。
$( "#add"). click( function(){
modifyNode(rightArray,selectArray, 'add');
modifyNode(leftArray,selectArray, 'remove');
//清空选中的数据
$. each(selectArray, function( i, item){
item. boards = [];
});

//封装的渲染方法
renderNode( $( '.first2'),rightArray)
//重新渲染left
renderNode( $( '.first'),leftArray)
})

$( "#remove"). click( function(){
modifyNode(leftArray,selectArray, 'add');
modifyNode(rightArray,selectArray, 'remove');
renderNode( $( '.first2'),rightArray)
renderNode( $( '.first'),leftArray);
})

//渲染节点
function renderNode( elem, arr){
elem. html( '');
arr. forEach( function( item){
//如果子节点的 length>0 则渲染 tree (父子节点一并渲染)
if( item. boards. length> 0){
//重新排序
item. boards. sort( function( item, item1){
return item. sID> item1. sID
});
elem. append( ' < p data-sid="'+ item. sID+ '" class=\"ui-widget-content\" >'+ item. name+ ' < /p>');
var $ul = $( ' < ul class="myul" > < /ul>'). appendTo(elem);
$. each( item. boards, function( i, boardItem){
var demo = ' < li class="ui-widget-content" data-name="'+ item. name+ '" data-districtid="'+ item. sID+ '" data-boardid="'+ boardItem. sID+ '" >'+ boardItem. name+ ' < /li>';
$ul. append(demo);
});
}
});
//重新绑定事件
bindUlClick();
}

//修改节点
function modifyNode( addArray, selectArray, type){
//通过id比较
for ( var i = 0; i < selectArray. length; i++) {
var objSelect = selectArray[i];
objAdd = addArray. filter( function( item){
return item. sID == objSelect. sID;
})[ 0];
var flag;
for ( var j = 0; j < objSelect. boards. length; j++) {
flag = false;
//查找 是否已经有节点
for ( var k = 0; k < objAdd. boards. length; k++) {
if( objAdd. boards. length> 0&& objSelect. boards[j]. sID== objAdd. boards[k]. sID){
flag = true; //查找到相同节点
if(type== 'remove')
objAdd. boards. remove(k);
}
}
if(!flag&&type== "add") objAdd. boards. push( objSelect. boards[j]);
}
}
}



//用原型的方法来增加一个pushItem和remove的属性方法 (感觉不是特别好理解,不方便理解的话可以不在原型上扩展)
Array. prototype. pushItem = function( name, item){
var _obj = this. filter( function( item, i){
return item. name == name;
})[ 0];
var flag = false;
for ( var i = 0; i < _obj. boards. length; i++) {
if( _obj. boards[i]. sID == item. sID)flag = true;
}
if(!flag) _obj. boards. push(item);
}
Array. prototype. remove = function( from, to) {
var rest = this. slice((to || from) + 1 || this. length);
this. length = from < 0 ? this. length + from : from;
return this. push. apply( this, rest);
};
});
< / script >

</ body >
</ html >

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值