复杂的 jq 拖拽、框选拖拽,ajax传值、解决删除与拖拽冲突

*{margin: 0 auto;}
    	.dragdiv{border: 2px solid black;height: 100px;width: 800px;margin-top: 20px;}
    	span{background: red;width: 50px;height: 50px;margin: 20px;display: inline-block;}
    	.top span{
    		background: #f9f9f9;
    		border: 1px solid #fbfbfa;
    		border-radius: 6px;
    		width: 50px;
    		height: 50px;
    		font-size: 16px;
    		margin: 9px;
    		margin-top: 1px;
    		padding: 9px;
    		display: inline-block;
    		text-align: left;
    		overflow: hidden;
    		vertical-align: top; 
    	}
    	.top span:HOVER,.bottom ul li:HOVER{background: #D1D1D1} 
    	input{
    		border: none;
    		background: none;
    		height: 24px;
    		width: 100%;
    		text-overflow: ellipsis;
    		white-space: nowrap;
    	}
    	
    	.bottom_right{
    		padding: 0px;
    	}
    	ul,li{
        	margin: 0px;
            padding: 0px;
            list-style: none;
        }
        ul{
        	display: flex;
            flex-direction: row;
            flex-wrap: wrap;
            width: 100%;
            border-bottom: 1px solid #C9C9C9;
        }
        ul:last-child{border-bottom: none;}
    	.bottom_right ul li{
    		box-sizing: border-box;
    		width: calc((100% - 10px) / 10);
    		width:-moz-calc((100% - 10px) / 10);
			width:-webkit-calc((100% - 10px) / 10);
    		border-left: 1px solid #C9C9C9; 
    		height: 50px;
    		flex:auto;         
    		line-height: 50px;  
    	}
    	li .span{
    		width: 100%;
    		height: 100%;
    		display: block;
    		overflow: hidden;
    		position: relative;
    	}
    	li .span div{
    		
    		width: 11px;
    		height: 11px;
    		padding: 1px;
		    font-size: 12px;
		    position: absolute;
		    right: 1px;
		    top: 1px;
    	}
    	.bottom_right ul li.selected,
    	.bottom_right ul li.temp-selected{background: #D1D1D1}

 





 

 

		
		$(function(){
	    	
			//隐藏页面,防止加载时排版混乱
			$(".List_div1").hide();
			
			$("input").prop("readonly","readonly");
			
			$(".div1").show();
			
	    	    drag.init('List_div1',"scheduling/schedulingAdd"); 
		    
		    //手术室内部拖拽
                     initSelectBox('.bottom_right',"拖拽路径","删除路径");
		}); 

		//点击任意位置,去除 class:selected
	    $("body").on("click",function() {
	    	$(".bottom_right li").removeClass('selected');
	    }); 
	    
	    //鼠标悬停
		$(".bottom ul li").hover(function() {
			$(this).css({'background':'#D1D1D1','color':'black'});
		},function(){
			$(this).removeAttr("style");
		});
		
		//拖拽
		var drag = {
	
		    class_name : null,  //允许放置的容器
			permitDrag : false,	//是否允许移动标识
	
			_x : 0,             //节点x坐标
		    _y : 0,			    //节点y坐标
		    _left : 0,          //光标与节点坐标的距离
		    _top : 0,           //光标与节点坐标的距离
	
		    old_elm : null,     //拖拽原节点
		    tmp_elm : null,     //跟随光标移动的临时节点
		    new_elm : null,     //拖拽完成后添加的新节点
		    url : null,			//ajax跳转路径
		    
		    //初始化
		    init : function (className,url){
	
		        //允许拖拽节点的父容器的classname(可按照需要,修改为id或其他)
		        drag.class_name = className;
		        
		        //ajax跳转路径
		        drag.url=url;
		        
		         //监听鼠标按下事件,动态绑定要拖拽的节点(因为节点可能是动态添加的)
		        $('.' + drag.class_name).on('mousedown', '.top span', function(event){
		            //当在允许拖拽的节点上监听到点击事件,将标识设置为可以拖拽
		            drag.permitDrag = true;
		            //获取到拖拽的原节点对象
		            drag.old_elm = $(this);
		            
		            //执行开始拖拽的操作
		            drag.mousedown(event);
		            return false;
		        });
	
		        //监听鼠标 移动
		        $(document).mousemove(function(event){
		            //判断拖拽标识是否为允许,否则不进行操作
		            if(!drag.permitDrag) return false;
		            //执行移动的操作
		            drag.mousemove(event);
		            return false;
		        });
	
		        //监听鼠标放开
		        $(document).mouseup(function(event){
		            //判断拖拽标识是否为允许,否则不进行操作
		            if(!drag.permitDrag) return false;
		            //拖拽结束后恢复标识到初始状态
		            drag.permitDrag = false;
		            //执行拖拽结束后的操作
		            drag.mouseup(event);
		            return false;
		        });
	
		    },
	
			//按下鼠标 执行的操作
			mousedown : function (event){
		           
		        //1.克隆临时节点,跟随鼠标进行移动
		        drag.tmp_elm = $(drag.old_elm).clone();
	
		        //2.计算 节点 和 光标 的坐标
		        drag._x = $(drag.old_elm).offset().left;
		        drag._y = $(drag.old_elm).offset().top;
	
		        var e = event || window.event;
		        drag._left = e.pageX - drag._x;
		        drag._top = e.pageY - drag._y;
		        
			        //3.修改克隆节点的坐标,实现跟随鼠标进行移动的效果
			        $(drag.tmp_elm).css({
			            'position' : 'absolute',
			            'background-color' : '#D1D1D1',
			            'left' : drag._x,
			            'top' : drag._y,
			        });
					
		        //4.添加临时节点
		        tmp = $(drag.old_elm).parent().append(drag.tmp_elm);
		        drag.tmp_elm = $(tmp).find(drag.tmp_elm);
		        $(drag.tmp_elm).css('cursor', 'move');
	
			},
	
			//移动鼠标 执行的操作
			mousemove : function (event){
				
		        //2.计算坐标
		        var e = event || window.event;
		        var x = e.pageX - drag._left;
		        var y = e.pageY - drag._top;
		        var maxL = $(document).width() - $(drag.old_elm).outerWidth();
		        var maxT = $(document).height() - $(drag.old_elm).outerHeight();
		        //不允许超出浏览器范围
		        x = x < 0 ? 0: x;
		        x = x > maxL ? maxL: x;
		        y = y < 0 ? 0: y;
		        y = y > maxT ? maxT: y;
			        //3.修改克隆节点的坐标
			        $(drag.tmp_elm).css({
			            'left' : x,
			            'top' : y,
			        });
	
		        //判断当前容器是否允许放置节点
		        $.each($('.' + drag.class_name + ' .bottom ul li'), function(index, value){
		        		
			            //获取容器的坐标范围 (区域)
			            var box_x = $(value).offset().left;     //容器左上角x坐标
			            var box_y = $(value).offset().top;      //容器左上角y坐标
			            var box_width = $(value).outerWidth();  //容器宽
			            var box_height = $(value).outerHeight();//容器高
			            //给可以放置的容器加背景色
			            if(e.pageX > box_x && e.pageX < box_x-0+box_width && e.pageY > box_y && 
			            		e.pageY < box_y-0+box_height && $(value).find("span").length<=0
			            ){
			            	
			            	//判断是否不在原来的容器下(使用坐标进行判断:x、y任意一个坐标不等于原坐标,则表示不是原来的容器)
			                if($(value).offset().left !== drag.old_elm.parent().offset().left 
			                || $(value).offset().top !== drag.old_elm.parent().offset().top){
			                    $(value).css('background-color', '#D1D1D1');
			                }
			            }else{
			                //恢复容器原背景色
			                $(value).removeAttr("style");
			            }
		        });
	
			},
	
		    //放开鼠标 执行的操作
		    mouseup : function (event){
	
		        //移除临时节点
		        $(drag.tmp_elm).remove();
	
		        //判断所在区域是否允许放置节点
		        var e = event || window.event;
		        
		        $.each($('.' + drag.class_name + ' div ul li'), function(index, value){
	
		            //获取容器的坐标范围 (区域)
		            var box_x = $(value).offset().left;     //容器左上角x坐标
		            var box_y = $(value).offset().top;      //容器左上角y坐标
		            var box_width = $(value).outerWidth();  //容器宽
		            var box_height = $(value).outerHeight();//容器高
		            
		            //判断放开鼠标位置是否想允许放置的容器范围内
		            if(e.pageX > box_x && e.pageX < box_x-0+box_width && e.pageY > box_y &&
		            	e.pageY < box_y-0+box_height && $(value).find("span").length<=0
		            ){
		            	
		                //判断是否不在原来的容器下(使用坐标进行判断:x、y任意一个坐标不等于原坐标,则表示不是原来的容器)
		                if($(value).offset().left !== drag.old_elm.parent().offset().left 
		                || $(value).offset().top !== drag.old_elm.parent().offset().top){
		                    //向目标容器添加节点
		                    tmp = $(drag.old_elm).clone();
		                  	var newObj;
		                  	//newObj=$(value).append(ht);
		                  		
		                  	//要传到后台的数据
		                  	var id=tmp.find('input[name="id"]').val(),
								page="schedulingList",
								type=$(value).index()+1,
								department=$(value).index(),
								time=$(value).parent().index();
		                  	
		                  	//保存路径
		                  	$.ajax({
		            			type: "POST",
		            			url: drag.url,
		           	 		dataType: "json",
		            			data: {
		            				"id":id, "page":page, 
		            				"type":type, "department":department, 
		            				"time":time, "date": $("#dt").val()
		            			},
		            			success: function (data) {
		            				//将数据重新绑定到排班上
		            				html(data);
		            			},
		            			error: function (data) {
		            				html(data);
		            			}
		        			}); 
		                    
		                    
		                    //删除原节点
		                    $(drag.old_elm).remove();
		                    //获取新添加节点的对象
		                    //drag.new_elm = $(newObj).find(tmp);
		                }
		            }
		            //恢复容器原背景色 class_name
		            
		            $(value).removeAttr("style");
		        });
		    },
		};
		
        var initSelectBox = function(selector, url, delUrl, selectCallback) {
        	
            function clearBubble(e) {
                if (e.stopPropagation) {
                    e.stopPropagation();
                } else {
                    e.cancelBubble = true;
                }

                if (e.preventDefault) {
                    e.preventDefault();
                } else {
                    e.returnValue = false;
                }
            }
            var $container = $(selector);
            var vv=null,
            	va=null;
            var arrs = [];
            
          	
          
    	    
            //  框选事件
            $container
	        	
                .on('mousedown', function(eventDown) {
                	
                    //  设置选择的标识
                    var isSelect = "up";
                    //  设置选框的初始位置
                    var startX = eventDown.x || eventDown.pageX;
                    var startY = eventDown.y || eventDown.pageY;
                    
                    //  遍历容器中的选项,获取选中的列
                    $(selector).find('li').each(function(i,txt) {
                    	
                        var $item = $(this);
                        
                        var itemX_pos = $item.prop('offsetWidth') + $item.prop('offsetLeft');
                        var itemY_pos = $item.prop('offsetHeight') + $item.prop('offsetTop');
                        
                        var condition1 = itemX_pos > startX;
                        var condition2 = itemY_pos > startY;
                        var condition3 = $item.prop('offsetLeft') < startX;
                        var condition4 = $item.prop('offsetTop') < startY;
                        
                        if (condition1 && condition2 && condition3 && condition4) {
                        	vv=$item.index();
                        }
                    });
                    //  根据鼠标移动,设置选框宽高
                    var _x = null;
                    var _y = null;
                    //var left;
                    //  清除事件冒泡、捕获
                    clearBubble(eventDown);
                    //  监听鼠标移动事件
                    $(selector).on('mousemove', function(eventMove) {
                        //  根据鼠标移动,设置选框的位置、宽高
                        _x = eventMove.x || eventMove.pageX;
                        _y = eventMove.y || eventMove.pageY;
                        //  暂存选框的位置及宽高,用于将 select-item 选中
                        var _left   = Math.min(_x);
                        var _top    = Math.min(_y, startY);
                        var _width  = Math.abs(_x);
                        var _height = Math.abs(_y - startY);
                        
                        //  遍历容器中的选项,进行选中操作
                        $(selector).find('li').each(function(i,txt) {
                        	
                            var $item = $(this);
                            
                            var itemX_pos = $item.prop('offsetWidth') + $item.prop('offsetLeft');
                            var itemY_pos = $item.prop('offsetHeight') + $item.prop('offsetTop');
                            //  判断 li 是否与选框有交集,添加选中的效果( temp-selected ,在事件 mouseup 之后将 temp-selected 替换为 selected)
                            var condition1 = itemX_pos > _left;
                            var condition2 = itemY_pos > _top;
                            var condition3 = $item.prop('offsetLeft') < _left;//(_left + _width);
                            var condition4 = $item.prop('offsetTop') < (_top + _height);
                            isSelect="move";
                            if (condition1 && condition2 && condition3 && condition4) {
                            	$item.addClass('temp-selected');
                            	if($item.index()!=vv && $item.find("span").length>0){
                            		$item.removeClass('temp-selected');
                            	}
                                
                            } 
                            
                            else if($item.index()!=vv || $item.find("span").length<=0){
                            		$item.removeClass('temp-selected');
                            }
                        });
                        //  清除事件冒泡、捕获
                        clearBubble(eventMove);
                    });
                    $(document).on('mouseup', function() {
                        $(selector).off('mousemove');
                        if(isSelect=="move"){
	                        $(selector)
	                            .find('li.temp-selected')
	                            .removeClass('temp-selected')
	                            .addClass('selected');
	                       
		                    $('.selected').each(function(i) {
		                    	//垂直移动时
		                    	if(vv==$(this).index()){
		                    		//有 span 标签,克隆本次循环span,添加class,方便水平移动时,保存源节点
			                    	if($(this).find(".span").length > 0){
			                    		va=$(this).find(".span").clone();
			                    		$(this).addClass('selectedww');
			                    		return true;
			                    	}
			                    	//没有 span 标签,添加class,保存新节点,删除全部class ‘selectedww’
			                    	else{
			                    		$(this).addClass('selectedw');
			                    		$(selector).find("li").removeClass('selectedww');
			                    	}
		                    	}
		                    	//水平移动时,添加class,保存要新节点
		                    	if($(this).find("span").length<=0 && vv!=$(this).index()){
		                    		$(this).addClass('selectedwww');
		                    	}
		                    });
		                    
		                    
				    var page,
					//源节点所在列
					ss=$('.selectedww').index()+1;
							
		                    //需要传到后台
		                    var id=[],			 //添加的节点id,方便后台查询
		                    pId=[],			 	 //添加的节点,pId
				    type=[],			 //添加的节点,几号手术室/状态
				    department=[],		 //添加的节点,手术室/列
				    time=[],			 //添加的节点,时间/行
				    de_id = [];			 //源节点的id,方便后台删除
		                    
							//如果有 selectedwww 这个class,就是水平移动
		                    if($('.selectedwww').hasClass("selectedwww")){
		                    	//遍历源节点
		                    	$('.selectedww').each(function(i) {
			                    	
			                    	arrs.push($(this).find(".span input[name='id']").val());
			                    	//源节点的pId
			                    	var ts=[$(this).find(".span input[name='pId']").val()];
			                    	
			                    	//遍历源节点的所在列
			                    	$('.bottom_right ul li:nth-child('+ss+')').each(function(j) {
			                    		//如果本次循环的pId == 源节点的pId,保存源节点的id
					                	if($(this).find('.span input[name="pId"]').val() == ts){
					                		de_id.push($(this).find('.span input[name="id"]').val());
					                		//$(this).find('.span').remove();
					               	 	}
				            		});
			                    });
		                    	
		                    	//数组去重
		                	    arrs.unique3();
		                		//数组去除 undefined
		                	    de_id.unique1();
		                	    
		                    	//需要传到后台的值
		                	    $('.selectedwww').each(function(i) {
		                	    	id[i]=arrs[i];
			                   		type[i]=$(this).index()+1;//几号手术室/状态
			                   		department[i]=$(this).index();//手术室/列
			                   		time[i]=$(this).parent().index();//时间/行
			                    }); 
		                	    page="update";
		                    }  
		                    
		                  //垂直移动添加
		                    //$('.selectedw').append(va); 
		                   
		                    //垂直移动,如果有 selectedw 这个class
		                    if($('.selectedw').hasClass("selectedw") && (va!=null && va!="")){
		                    	//需要传到后台的值
			                   	$('.selectedw').each(function(i) {
			                   		id[i]=va.find('input[name="id"]').val();
			                   		type[i]=$(this).index()+1;//几号手术室/状态
			                   		department[i]=$(this).index();//手术室/列
			                   		time[i]=$(this).parent().index();//时间/行
			                    });
			                   	page="add";
		                    }
		                    if(id.length>0){
	                 			$.ajax({
	    		           			type: "POST",
	    		           			url: url,
	    		          	 		dataType: "json",
	    		          	 		traditional: true,
	    		           			data: {
	    		           				"id":id, "de_id":de_id, 
	    		           				"page":page, "type":type, 
	    		           				"department":department, 
	    		           				"time":time, "date": $("#dt").val()
	    		           			},
	    		           			
	    		           			success: function (data) {
	    		           				//将数据重新绑定到排班上
	    		           				html(data);
	    		           			},
	    		           			error: function (data) {
	    		           				html(data);
	    		           			}
	    	       				}); 
	                 			
	                 		}
	                        
		                 	
		                    $(selector).find("li").removeClass('selected selectedw selectedww selectedwww');
	                        va=null,arrs=[],de_id=[];
		                    if (selectCallback) {
	                            selectCallback();
	                        }
                        }
                        else{
		                    //解除删除的绑定,防止重复删除
		                    //$(".bottom_right ul li .span div").off('click');
		                  	//删除排班人员
		            	    $(".bottom_right ul li .span div").on("click",function() {
		            	    	var id=$(this).parent().find('input[name="id"]').val();
		            	    	var d=$(this).parent().parent().index();
		                  		if(confirm('确定要删除吗?')) 
		                  		{
		                  			$.ajax({
		    		           			type: "POST",
		    		           			url: delUrl,
		    		          	 		dataType: "json",
		    		          	 		traditional: true,
		    		           			data: {
		    		           				"id":id, "d":d, 
		    		           				"date":$("#dt").val()
		    		           			},
		    		           			
		    		           			success: function (data) {
		    		           				//将数据重新绑定到排班上
		    		           				html(data);
		    		           			},
		    		           			error: function (data) {
		    		           				html(data);
		    		           			}
		    	       				});  
		                  			//alert(id);
		                  			//window.location.href="scheduling/schedulingDel?id="+id+"&date="+$("#dt").val();  
		                    		return true; 
		                  		} 
		                  		return false; 
		            	    }); 
                        }
                        
                    });
                    
                });
          
        };

		//数组去除 undefined
        Array.prototype.unique1 = function(){
        	var res = [];
       	 	for(var i = 0; i < this.length; i++){
       	  		if(typeof(this[i])!='undefined' && this[i]!="") {
	       	  		res.push(this[i]);
	    	    }
       	 	}
       	 	return res;
        };
        //数组去重
        Array.prototype.unique3 = function(){
       		var res = [];
       	 	var json = {};
       	 	for(var i = 0; i < this.length; i++){
       	  		if(!json[this[i]]){
       	   			res.push(this[i]);
       	   			json[this[i]] = 1;
       	  		}
       	 	}
       	 	return res;
       	}

 

你可能感兴趣的:(java,js,jq,html,ssm框架)