实现左右两边用户添加、删除、调位置(上下移动)、排序等的功能
option排序,option上下移动位置,option调整位置
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
蕃薯耀 2016年3月11日 15:18:10 星期五
http://fanshuyao.iteye.com/
一、效果图
二、功能实现
1、组织架构树的html
<ul id="tree"></ul>
2、右边操作的html
<div data-options="region:'center',title:'选择人员'" style="width:70%;padding: 10px;"> <div class="searchDiv"> <form id="ff" method="post" novalidate> 关键字: <input class="w110 easyui-textbox ztrim" id="searchText" name="searchText" value="" data-options="required:true"/> <a href="javascript:void(0)" class="easyui-linkbutton c6" onclick="goSearch();">搜索</a> </form> </div> <div class="showUserDiv" style="margin: 10px 0px;overflow: auto;"> <div class="listDiv"> <div style="min-width: 200px;margin-bottom: 5px;" class="bold">待选列表</div> <div> <select id="userSelect" multiple="multiple" style="min-height: 250px;min-width: 200px;"> </select> </div> </div> <div class="listDiv button"> <div><a href="javascript:void(0)" class="easyui-linkbutton c6" onclick="addUser('userSelect','userSelected');">添加</a></div> <div><a href="javascript:void(0)" class="easyui-linkbutton c6" onclick="removeUser('userSelected');">删除</a></div> <div><a href="javascript:void(0)" class="easyui-linkbutton c6" onclick="addUsers('userSelect','userSelected');">全部添加</a></div> <div><a href="javascript:void(0)" class="easyui-linkbutton c6" onclick="removeUsers('userSelected');">全部删除</a></div> <div> <a href="javascript:void(0)" class="easyui-linkbutton c6" onclick="goUp('userSelected');">上移</a> <a href="javascript:void(0)" class="easyui-linkbutton c6" onclick="goDown('userSelected');">下移</a> </div> <div> <a href="javascript:void(0)" class="easyui-linkbutton c6" onclick="goSort('userSelected','up');">升序</a> <a href="javascript:void(0)" class="easyui-linkbutton c6" onclick="goSort('userSelected','down');">降序</a> </div> </div> <div class="listDiv"> <div style="min-width: 200px;margin-bottom: 5px;" class="bold">已选列表</div> <div> <select id="userSelected" multiple="multiple" style="min-height: 250px;min-width: 200px;"> </select> </div> </div> </div> <div id="userInfo" class="border-eee clear" style="height: 60px;background-color: #eee;max-width: 450px;margin-top: 10px;overflow: auto;"> <div> <span class="bold">描述信息:</span> <span id="userInfoName"></span> </div> <div id="userInfoOrgs"></div> </div> </div>
3、树的数据初始化js
function setOption(selectId, users){ $("#"+selectId).empty(); if(users != null && users.length > 0){ for(var i=0; i<users.length; i++){ $("#"+selectId).append("<option value='"+ users[i].userId +"'>"+ users[i].userName+"</option>"); } } }; var treeId = "tree"; function showUsers(node){ $.ajax({ url : basePath + "/xxx/url", method : 'post', data : {orgId:node.id}, async : true, error : function() { alert("操作失败"); }, success : function(data) { var users = JSON.parse(data); setOption("userSelect", users); } }); }; $("#"+treeId).tree({ url:basePath + "/xxx/url", lines:true, onClick: function(node){ showUsers(node); } });
4、【添加】功能
function addUser(selectSourceId, selectTargetId){ var targetOptions = $("#" +selectTargetId+ " option"); var sourceOptionsSelected = $("#" +selectSourceId+ " option:selected"); if(targetOptions.length < 1){ $("#" +selectTargetId).append($(sourceOptionsSelected).clone()); }else{ for(var i=0; i<sourceOptionsSelected.length; i++){ var k = 0; for(var j=0; j<targetOptions.length; j++){ if(targetOptions[j].value == sourceOptionsSelected[i].value){ break; } k++; } if(targetOptions.length == k){ $("#" +selectTargetId).append($(sourceOptionsSelected[i]).clone()); } } } };
5、【删除】功能
function removeUser(selectTargetId){ $("#" +selectTargetId+ " option:selected").detach(); };
6、【全部添加】功能
function addUsers(selectSourceId, selectTargetId){ var targetOptions = $("#" +selectTargetId+ " option"); var sourceOptionsSelected = $("#" +selectSourceId+ " option"); if(targetOptions.length < 1){ $("#" +selectTargetId).append($(sourceOptionsSelected).clone()); }else{ for(var i=0; i<sourceOptionsSelected.length; i++){ var k = 0;//k用来计算匹配的次数 //如果右边有存在的项,则k会小于targetOptions.length //相等则表示右边还没有,需要添加 for(var j=0; j<targetOptions.length; j++){ if(targetOptions[j].value == sourceOptionsSelected[i].value){ break; } k++; } if(targetOptions.length == k){ $("#" +selectTargetId).append($(sourceOptionsSelected[i]).clone()); } } } };
7、【全部删除】功能
function removeUsers(selectTargetId){ $("#" +selectTargetId+ " option").detach(); };
8、【上移】功能,把选中的项往上移动,可以选择多个不同位置的项
function goUp(selectTargetId){ var optionsSelected = $("#" +selectTargetId+ " option:selected"); var options = $("#" +selectTargetId+ " option"); if(optionsSelected.length > 0){ for(var i=1; i<options.length; i++){ if(options[i].selected){ if(!$("#" +selectTargetId+ " option")[i-1].selected){ $(options[i]).insertBefore($($("#" +selectTargetId+ " option")[i-1])); } } } } };
9、【下移】功能,把选中的项往下移动,可以选择多个不同位置的项
function goDown(selectTargetId){ var optionsSelected = $("#" +selectTargetId+ " option:selected"); var options = $("#" +selectTargetId+ " option"); if(optionsSelected.length > 0){ for(var i=(options.length-2); i>-1; i--){ if(options[i].selected){ if(!$("#" +selectTargetId+ " option")[i+1].selected){ $(options[i]).insertAfter($($("#" +selectTargetId+ " option")[i+1])); } } } } };
10、排序功能,包括升序和降序
(1)排序js功能插件
jQuery.fn.sortElements = (function(){ var sort = [].sort; return function(comparator, getSortable) { getSortable = getSortable || function(){return this;}; var placements = this.map(function(){ var sortElement = getSortable.call(this), parentNode = sortElement.parentNode, // Since the element itself will change position, we have // to have some way of storing its original position in // the DOM. The easiest way is to have a 'flag' node: nextSibling = parentNode.insertBefore( document.createTextNode(''), sortElement.nextSibling ); return function() { if (parentNode === this) { throw new Error( "You can't sort elements if any one is a descendant of another." ); } // Insert before flag: parentNode.insertBefore(this, nextSibling); // Remove flag: parentNode.removeChild(nextSibling); }; }); return sort.call(this, comparator).each(function(i){ placements[i].call(getSortable.call(this)); }); }; })();
(2)调用方法
function goSort(selectTargetId, type){ $("#" +selectTargetId+ " option").sortElements(function(a, b){ if(type.toLowerCase() == "up"){//升序 return $(a).text() > $(b).text() ? 1 : -1; }else{//降序 return -($(a).text() > $(b).text() ? 1 : -1); } }); };
11、点击显示描述信息
(1)处理显示数据
function setOrgs(id,orgs){ $("#"+id).empty(); if(orgs != null && orgs.length > 0){ for(var i=0; i<orgs.length; i++){ $("#"+id).append("<div>"+ orgs[i].parentOrgName+"</div>"); } } };
(2)绑定点击事件,jquery1.11版本号需要像下面这样绑定,不能使用live绑定。
$(document).on('click', 'option', function(){ var thisOption = $(this); $.ajax({ url : basePath + "/xxx/url", method : 'get', data : {userId:thisOption.val()}, async : true, error : function() { alert("操作失败"); }, success : function(data) { $("#userInfoName").text(thisOption.text()); var orgs = JSON.parse(data); setOrgs("userInfoOrgs", orgs); } }); });
12、父项层级关系的查询实现
(1)业务处理
/** * 递归获取传入组织org的父项组织层级关系 * @param org * @param orgs 返回的父项组织层级关系集合(包含org本身) */ public void getOrgParents(Org org, List<Org> orgs){ if(org != null){ if(org.getParentOrgId() != null){ Org parentOrg = orgService.getById(org.getParentOrgId()); getOrgParents(parentOrg, orgs); } orgs.add(org); } } /** * 根据父项组织层级关系集合(parentOrgs)获取显示的字符串 * @param parentOrgs 父项组织层级关系集合 * @param linkSymbol 字符串连接符号,linkSymbol==null时默认为→,可以设置为“—”、“——”等特殊符号 */ public String getOrgParentsString(List<Org> parentOrgs, String linkSymbol){ StringBuffer parentString = new StringBuffer(""); if(linkSymbol == null){ linkSymbol = "→"; } for (Org parent : parentOrgs) { parentString.append(parent.getOrgName()).append(" ").append(linkSymbol).append(" "); } if(parentString.indexOf(linkSymbol) > -1){ parentString.delete(parentString.lastIndexOf(linkSymbol)-1, parentString.length()); } return parentString.toString(); }
(2)功能实现调用
@RequestMapping("/xxx") @ResponseBody public String xxx(HttpServletRequest rq, HttpServletResponse rs) throws Exception { String userId = rq.getParameter("userId"); if(!StrUtils.isEmpty(userId)){ List<Org> orgs = orgService.getOrgsByUserId(userId); for (Org org : orgs) { List<Org> parentOrgs = new ArrayList<Org>(); getOrgParents(org, parentOrgs); org.setParentOrgName(getOrgParentsString(parentOrgs, null)); } return JsonUtils.Object2String(orgs); } return ""; }
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
蕃薯耀 2016年3月11日 15:18:10 星期五
http://fanshuyao.iteye.com/
相关推荐
实现左右两边侧滑菜单的核心步骤如下: 1. **集成SlidingMenu库**:首先,你需要在项目中添加`SlidingMenu`库。可以通过在`build.gradle`文件中添加依赖或者下载库的源代码并将其导入到项目中。 2. **创建菜单布局...
【网站左右两边滚动对联广告】是一种常见的网页设计元素,特别是在商业网站中,它用于吸引用户的注意力并展示广告或重要信息。这种类型的广告通常以滚动或滑动的方式出现在页面的两侧,可以是横向或者纵向移动,增加...
但是,要实现左右上下或者左右底部的阴影,我们需要更精细的控制。例如,我们可以使用`CGMutablePath`来创建更复杂的路径,包括添加额外的线段来形成阴影。或者,我们可以利用CALayer的`borderWidth`和`borderColor`...
通常,Progressbar的滚动方向是从左到右,但有时我们可能需要实现更独特的交互效果,比如支持左右两边同时滚动。这样的设计可以增加界面的动态感和视觉吸引力,尤其在展示双方向任务进度或者对比数据时更为适用。 ...
本文将深入探讨如何使用ZTree实现左右两棵树之间的节点移动,包括节点的添加、删除以及同步更新的操作。 首先,ZTree是基于jQuery的插件,它的核心功能包括节点的增删改查、拖拽排序、多选、权限控制等。在实际应用...
**jQuery案例——左右移动** jQuery 是一款非常流行的 JavaScript 库,它简化了JavaScript的DOM操作、事件...同时,这也是一个很好的起点,你可以在此基础上扩展更多的交互效果,比如添加缓冲动画、无限循环移动等。
在网页设计中,"左右两边隐藏展开的QQ客服"是一种常见的交互式功能,它为用户提供了一个方便快捷的方式与网站客服进行沟通。这种特效通常应用于电子商务、资讯类网站以及各种在线服务平台,以提升用户体验并增强客户...
JavaScript和vue实现左右两栏,中间拖动按钮可以拖动左右两边的宽度
【中间大两边小的viewpager】是一种常见的UI设计模式,主要应用于移动应用或者网页中,为用户提供一个可滑动浏览的图像或内容集合。这种设计能够突出中间元素,同时通过大小和阴影效果来引导用户的注意力,提升用户...
- 根据按键状态改变LED灯的亮灭顺序,实现左右移动。 - 添加中断服务程序,处理按键按下事件,如暂停、切换模式等。 - 通过延时函数控制LED灯点亮的时间,实现“流动”效果。 6. **实际应用**: - 这种按键控制...
为了增加用户体验,还可以添加一些额外的功能,如指示器(Indicator)来显示当前选中的图片,以及左右滑动的手势支持。指示器通常是一个简单的UI组件,如UIPageControl,其点的数量与图片数量对应,当前选中图片的点...
在Android开发中,`Gallery`组件是一个非常实用的控件,用于展示一系列的图片或其它内容,用户可以左右滑动浏览。在这个特定的项目中,我们看到的目标是创建一个具有特殊布局特性的`Gallery`:中间的大图两边配以小...
【中间图片放大,两边缩小,轮播效果】是一种常见的网页设计技术,主要应用于网站的头部或者产品展示区域,用于吸引用户的注意力。这种效果通过动态改变图片的大小和位置,营造出一种视觉焦点转移的动画效果,使用户...
在本压缩包“行业文档-设计装置-一种左右两边带门式书柜.zip”中,主要包含了一份关于设计装置的详细文档,特别是聚焦于一种创新的左右两边带门式的书柜设计。这份文档可能涵盖了家具设计、结构工程、材料选用以及...
Makefile支持多种语法结构,包括变量赋值、条件判断、循环等,其中变量赋值是其最基本也是最重要的功能之一。 ### 变量赋值方式 在Makefile中,变量赋值有两种主要的方式:简单赋值(`=`)和复合赋值(`:=`)。...
在本文中,我们将深入探讨如何使用Vue.js框架与Element-UI库来实现穿梭框(Transfer)数据的自定义排序功能。Element-UI是基于Vue.js的一套丰富的UI组件库,其中包括了穿梭框组件,它常用于在两个列表之间进行数据的...
"Fragment实现左右,上下布局"这个主题聚焦于如何利用Fragment来创建左右分屏和上下布局的效果,这对于虚拟现实(VR)开发中的播放器界面设计尤为重要。 Fragment是Android SDK中的一个类,它代表了应用程序界面的...
3. **递归排序**:对基准元素左右两边的子数组分别进行上述的快速排序操作,直到所有元素都在正确的位置。 4. **程序运行计时**:为了分析算法的时间效率,可以在代码中添加计时功能,如使用`std::chrono`库来记录...