`

实现左右两边用户添加、删除、调位置(上下移动)、排序等的功能

阅读更多

实现左右两边用户添加、删除、调位置(上下移动)、排序等的功能

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/

  • 大小: 26.5 KB
分享到:
评论

相关推荐

    左右两边侧滑菜单+字母索引实现

    实现左右两边侧滑菜单的核心步骤如下: 1. **集成SlidingMenu库**:首先,你需要在项目中添加`SlidingMenu`库。可以通过在`build.gradle`文件中添加依赖或者下载库的源代码并将其导入到项目中。 2. **创建菜单布局...

    网站左右两边滚动对联广告

    【网站左右两边滚动对联广告】是一种常见的网页设计元素,特别是在商业网站中,它用于吸引用户的注意力并展示广告或重要信息。这种类型的广告通常以滚动或滑动的方式出现在页面的两侧,可以是横向或者纵向移动,增加...

    ios-UIView设置局部阴影,左右上下,左右底部阴影.zip

    但是,要实现左右上下或者左右底部的阴影,我们需要更精细的控制。例如,我们可以使用`CGMutablePath`来创建更复杂的路径,包括添加额外的线段来形成阴影。或者,我们可以利用CALayer的`borderWidth`和`borderColor`...

    支持左右两边同时滚动的Progressbar

    通常,Progressbar的滚动方向是从左到右,但有时我们可能需要实现更独特的交互效果,比如支持左右两边同时滚动。这样的设计可以增加界面的动态感和视觉吸引力,尤其在展示双方向任务进度或者对比数据时更为适用。 ...

    ztree实现左右两棵树的节点移动

    本文将深入探讨如何使用ZTree实现左右两棵树之间的节点移动,包括节点的添加、删除以及同步更新的操作。 首先,ZTree是基于jQuery的插件,它的核心功能包括节点的增删改查、拖拽排序、多选、权限控制等。在实际应用...

    jQuery案例——左右移动

    **jQuery案例——左右移动** jQuery 是一款非常流行的 JavaScript 库,它简化了JavaScript的DOM操作、事件...同时,这也是一个很好的起点,你可以在此基础上扩展更多的交互效果,比如添加缓冲动画、无限循环移动等。

    左右两边隐藏展开的QQ客服

    在网页设计中,"左右两边隐藏展开的QQ客服"是一种常见的交互式功能,它为用户提供了一个方便快捷的方式与网站客服进行沟通。这种特效通常应用于电子商务、资讯类网站以及各种在线服务平台,以提升用户体验并增强客户...

    JavaScript和vue实现左右两栏,中间拖动按钮可以拖动左右两边的宽度

    JavaScript和vue实现左右两栏,中间拖动按钮可以拖动左右两边的宽度

    中间大两边小的viewpager

    【中间大两边小的viewpager】是一种常见的UI设计模式,主要应用于移动应用或者网页中,为用户提供一个可滑动浏览的图像或内容集合。这种设计能够突出中间元素,同时通过大小和阴影效果来引导用户的注意力,提升用户...

    51单片机 按键控制流水灯左右两边中间移(keil+proteus仿真)

    - 根据按键状态改变LED灯的亮灭顺序,实现左右移动。 - 添加中断服务程序,处理按键按下事件,如暂停、切换模式等。 - 通过延时函数控制LED灯点亮的时间,实现“流动”效果。 6. **实际应用**: - 这种按键控制...

    轮播图-实现中间大两边小的轮播图

    为了增加用户体验,还可以添加一些额外的功能,如指示器(Indicator)来显示当前选中的图片,以及左右滑动的手势支持。指示器通常是一个简单的UI组件,如UIPageControl,其点的数量与图片数量对应,当前选中图片的点...

    gallery实现中间大两边小且图片带毛玻璃效果

    在Android开发中,`Gallery`组件是一个非常实用的控件,用于展示一系列的图片或其它内容,用户可以左右滑动浏览。在这个特定的项目中,我们看到的目标是创建一个具有特殊布局特性的`Gallery`:中间的大图两边配以小...

    中间图片放大,两边缩小,轮播效果

    【中间图片放大,两边缩小,轮播效果】是一种常见的网页设计技术,主要应用于网站的头部或者产品展示区域,用于吸引用户的注意力。这种效果通过动态改变图片的大小和位置,营造出一种视觉焦点转移的动画效果,使用户...

    行业文档-设计装置-一种左右两边带门式书柜.zip

    在本压缩包“行业文档-设计装置-一种左右两边带门式书柜.zip”中,主要包含了一份关于设计装置的详细文档,特别是聚焦于一种创新的左右两边带门式的书柜设计。这份文档可能涵盖了家具设计、结构工程、材料选用以及...

    Makefile文件中的等号左右两边能不能有空格

    Makefile支持多种语法结构,包括变量赋值、条件判断、循环等,其中变量赋值是其最基本也是最重要的功能之一。 ### 变量赋值方式 在Makefile中,变量赋值有两种主要的方式:简单赋值(`=`)和复合赋值(`:=`)。...

    vue+element-ui实现穿梭框数据自定义排序

    在本文中,我们将深入探讨如何使用Vue.js框架与Element-UI库来实现穿梭框(Transfer)数据的自定义排序功能。Element-UI是基于Vue.js的一套丰富的UI组件库,其中包括了穿梭框组件,它常用于在两个列表之间进行数据的...

    Fragment实现左右,上下布局

    "Fragment实现左右,上下布局"这个主题聚焦于如何利用Fragment来创建左右分屏和上下布局的效果,这对于虚拟现实(VR)开发中的播放器界面设计尤为重要。 Fragment是Android SDK中的一个类,它代表了应用程序界面的...

    快速排序算法c++实现

    3. **递归排序**:对基准元素左右两边的子数组分别进行上述的快速排序操作,直到所有元素都在正确的位置。 4. **程序运行计时**:为了分析算法的时间效率,可以在代码中添加计时功能,如使用`std::chrono`库来记录...

Global site tag (gtag.js) - Google Analytics