javascript事件类型之界面拖拽交互

一、在线DEMO

界面拖拽交互

二、关于事件对象中的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 {
				width: 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>
时间: 2024-08-06 01:07:04

javascript事件类型之界面拖拽交互的相关文章

javascript如何指定元素的拖拽范围

javascript如何指定元素的拖拽范围:有时候拖拽效果需要限定在某一个指定的元素之内,也就是说只能够在指定的元素内进行拖拽,下面就通过一个代码实例介绍一下如何实现此效果.代码实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/&q

JavaScript事件类型

JavaScript事件类型 Web浏览器中可能发生的事件有很多类型.这里我将主要将下面几种常用的事件类型: UI事件 焦点事件 鼠标与滚轮事件 键盘与文本事件 复合事件 变动事件 HTML5事件 设备事件 触摸与手势事件 第一部分:UI事件 UI事件中UI即(User Interface,用户界面),当用户与页面桑拿的元素交互时触发. UI事件中主要包括load,unload,abort,error,select,resize,scroll事件. 1.load事件 此事件为当页面完全加载完之后

ionic 手势事件(滑动,拖拽,点击...)

ionic之AngularJS(十)——手势事件 Posted on 2015年12月23日 by cswisdomliu 长按 : on-hold 在屏幕同一位置按住超过500ms,将触发on-hold事件: 你可以在任何元素上使用这个指令挂接监听函数: <any on-hold=“…”>…</any> 示例代码: <body  ng-controller=”ezCtrl”><ion-header-bar class=”bar-positive”  on-hol

JavaScript实现网页元素的拖拽效果

以下的页面中放了两个div,能够通过鼠标拖拽这两个元素到任何位置. 实现该效果的HTML页面代码例如以下所看到的: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style type="text/css"> #xixi { width:200px; h

javascript事件类型汇总

事件类型: onblur onchange onclick ondblclick onerror onfocus onkeydown onkeypress onkeyup onload onmousedown onmouseenter onmouseleave onmousemove onmouseout onmouseover onmouseup onresize onscroll onselect onsubmit //这些事最常用的事件(在页面上) onblur ,onchange,onc

javascript实现最简单的拖拽效果

// by zhangxinxu welcome to visit my personal website http://www.zhangxinxu.com/ // zxx.drag v1.0 2010-03-23 元素的拖拽实现 var params = { left: 0, top: 0, currentX: 0, currentY: 0, flag: false }; //获取相关CSS属性 var getCss = function(o,key){ return o.currentSt

&lt;JavaScript&gt;使用onmousemove事件实现移动(拖拽)div 出现的关于offsetX的问题

出现的问题如下图所示(截屏看不出来看log) 再移动鼠标的过程中会不断的出现异常值导致拖动的div不断切换位置,回到左上角. 我以为是冒泡机制导致的所以添加了下面一段阻止冒泡,随便也阻止了默认事件,但是并没有效果 ================================================================== ev.preventDefault(); if (ev.stopPropagation) { ????ev.stopPropagation(); }el

JavaScript 事件类型

1.点击事件 click:鼠标按下弹起完成后触发 mousedown:属性按下瞬间触发 mouseup:鼠标弹起瞬间触发 dblclick:鼠标双击触发 <script> document.onclick= function(){ console.log("click") } document.onmousedown= function(){ console.log("mousedown") } document.onmouseup= function(

原生拖拽,拖放事件(drag and drop)

原生拖拽,拖放事件(drag and drop) 拖拽,拖放事件可以通过拖拽实现数据传递,达到良好的交互效果,如:从操作系统拖拽文件实现文件选择,拖拽实现元素布局的修改. drag and drop事件流程 一个完整的drag and drop流程通常包含以下几个步骤: 设置可拖拽目标.设置属性draggable="true"实现元素的可拖拽. 监听dragstart设置拖拽数据 为拖拽操作设置反馈图标(可选) 设置允许的拖放效果,如copy,move,link 设置拖放目标,默认情况