zoukankan      html  css  js  c++  java
  • javascript事件类型之界面拖拽交互

    一、在线DEMO

     界面拖拽交互

    思路:鼠标移动的距离就是元素要移动的距离,所以关键点就是要得到鼠标点击元素时的
             坐标和鼠标移动以后释放时的鼠标的坐标。

             1.点击元素事件处理,确定移动元素和鼠标的位置。用鼠标事件中的onmousedown方法获取鼠标点击元素时的坐标。

             2.鼠标移动时的事件处理。用鼠标事件中的onmousemove方法获取鼠标移动时的坐标。

             3.松开元素的事件处理。用鼠标事件中的onmouseup方法来处理鼠标松开时元素位置不再跟随鼠标移动的动作。

            Firefox亲测:onmousedown、onmousemove、onclick事件对象里面都有clientX(Y)、pageX(Y)、screenX(Y)这三个属   性。

    二、关于事件对象中的clientX(Y)、pageX(Y)、screenX(Y)、offsetX(Y)的区别

       

             关于clientX(Y)、pageX(Y)、screenX(Y)我有如下总结:

             screenX >clientX = pageX

             screenY>pageY>=clientY(当页面没有滚动的时候pageY和clientY相等)

    三、测试代码

        IE事件中没有pageX(Y)事件,但是可以通过分别获取clientX(Y)、scrollLeft(Top)的值之后将两者相加得到pageX(Y)。

      

    <!DOCTYPE html>
    <html>
    
    	<head>
    		<meta charset="UTF-8">
    		<title></title>
    		<style>
    			div {
    				 50px;
    				height: 200px;
    				margin-top: 100px;
    				background-color: #6090B6;
    			}
    		</style>
    	</head>
    
    	<body>
    		<div id="main">
    			<button id="btn">确定</button>
    			<div id="div1"></div>
    			<div></div>
    			<div></div>
    			<div></div>
    			<div></div>
    			<div></div>
    			<div></div>
    			<div></div>
    			<div></div>
    			<div></div>
    			<div></div>
    			<div></div>
    			<div></div>
    		</div>
    	</body>
    	<script>
    		var EventUtil = {
    			//事件处理
    			addHandler: function(element, type, handler) {
    				if(element.addEventListener) {
    					element.addEventListener(type, handler, false);
    				} else if(element.addEvent) {
    					//ie9之前的浏览器的事件监听方式,和上面的方式不一样
    					//attachEvent中的事件类型前有一个on
    					element.attachEvent("on" + type, handler);
    				} else {
    					element["on" + type] = handler;
    				}
    			},
    
    			//ie8即更早版本只支持事件冒泡,ie中使用attachEvent
    			//事件处理程序会在全局作用域中运行,所以回调函数中的this等于window,
    			//而不是当前点击的元素
    			getEvent: function(event) {
    				return event ? event : window.event;
    			},
    
    			//获取目标对象,即当前被点击的元素IE中用event.srcElement获取
    			getTarget: function(event) {
    				return event.target || event.srcElement;
    			},
    
    			preventDefault: function(event) {
    				if(event.preventDefault) {
    					event.preventDefault();
    				} else { //IE
    					event.returnValue = false;
    				}
    			},
    
    			removeHandler: function(element, type, handler) {
    				if(element.removeHandler) {
    					element.removeListener(type, handler, false);
    				} else if(element.detachEvent) {
    					element.detachEvent("on" + type, handler);
    				} else {
    					element["on" + type] = null;
    				}
    			},
    
    			stopPropagation: function(event) {
    				//stopPropagation() 可以同时取消捕获或冒泡
    				if(event.stopPropagation) {
    					event.stopPropagation();
    				} else { //IE只能需要冒泡
    					event.cancelBubble = true;
    				}
    			}
    		};
    
    		document.onmousemove = function(event) {
    			var e = EventUtil.getEvent(event);
    			//不包括页面滚动距离,不是鼠标的实际位置
    			console.log("------------鼠标移动----------------------");
    			console.log("页面坐标位置:" + e.pageX + " " + e.pageY);
    			console.log("客户区坐标:" + e.clientX + " " + e.clientY);
    			console.log("屏幕坐标:" + e.screenX + " " + e.screenY);
    		};
    		var divs = document.getElementsByTagName("div");
    		for(var i = 0; i < divs.length; i++) {
    			var div = divs[i];
    			EventUtil.addHandler(div, "click", function(event) {
    				//EventUtil.addHandler(div, "mousedown", function(event) {
    				var e = EventUtil.getEvent(event);
    				var pageX = e.pageX,
    					pageY = e.pageY;
    
    				//支持IE浏览器  获取鼠标当前坐标
    				if(pageX === undefined) {
    					//document.body混杂模式  document.documentElement标准模式
    					pageX = e.clientX + (document.body.scrollLeft ||
    						document.documentElement.scrollLeft);
    				}
    				if(pageY === undefined) {
    					pageY = e.clientY + (document.body.scrollTop ||
    						document.documentElement.scrollTop);
    				}
    				
    				console.log("-------------元素被点击之后-----------------");
    				console.log("页面坐标位置:" + pageX + " " + pageY);
    				console.log("客户区坐标:" + e.clientX + " " + e.clientY);
    				console.log("屏幕坐标:" + e.screenX + " " + e.screenY);
    				e.stopPropagation();//阻止冒泡
    			});
    		}
    
    	</script>
        
    </html>
    

       

      

  • 相关阅读:
    1.Lucene
    docker 安装常用服务
    docker 常用命令
    05-vue中使用样式
    04-vue的事件修饰符
    03-用基本指令实现跑马灯效果
    02-vue基本指令
    01-vue分层概念MVVM
    Redis-持久化机制
    BigDecimal工具类
  • 原文地址:https://www.cnblogs.com/yy95/p/5931527.html
Copyright © 2011-2022 走看看