JavaScript Event

JavaScript Event API:http://www.w3school.com.cn/jsref/dom_obj_event.asp

什么是事件驱动模型?

由事件的发生来触发程序的执行

都有哪些事件?

onclick       单击
ondblclick    双击
onmouseover   鼠标划入
onmouseout    鼠标划出
onfocus       获得焦点
onblur        失去焦点
onload        加载完成
onerror
ontimeout

onkeydown     键盘被按下
onkeypress    键盘按下并松开 , 不适用于组合键 如:ctrl 、alt
onkeyup       键盘松开
onscroll      窗口滚动
onresize      改变大小
onmousemove   鼠标的移动
onchange      内容被改变并失去焦点

Event对象是干嘛的?

有了Event,可以处理任何跟鼠标或键盘相关的信息
比如:  计算鼠标的位置,计算用户按下了哪个键?


怎么得到Event对象?

xxx.onclick = function(evt){
     //use evt ...........
}
xxx.onclick = function(){
argument[0]
}
在IE中event 是由window.event获取的
兼容
function(e){
var e = e || event;
}

button属性代表什么?

代表了事件发生时,鼠标哪个键被按下
button==0  左键
button==1  滚轮
button==2  右键

clientX和clientY

鼠标在 浏览器的可视区域  的坐标(即浏览器窗口)


计算鼠标的页面绝对位置

var e = e || event;
var x = e.clientX + document.body.scrollLeft||document.documentElement.scrollLeft;
var y = e.clientY + document.body.scrollTop||document.documentElement.scrollTop; //Google|火狐

此外也可用 e.pageX和e.pageY (由Google浏览器提出较晚) ,不兼容IE8及以下

	onload = function(){
			document.onmousemove = function(e){
				
				var e = e || window.event;
				var x = e.clientX + (document.body.scrollLeft || document.documentElement.scrollLeft);
				var y = e.clientY + (document.body.scrollTop || document.documentElement.scrollTop);			
				document.title="X: "+x+" Y:"+y;
			}
		}




offsetX和offsetY

鼠标在 当前事件触发的元素上的坐标



和键盘相关的keyCode以及组合键

keyCode  键盘的ascii码 

兼容写法  which

keypress和 keydown的 区别

在google中组合键: Unicode(ctrl+enter)=10

在keypress中,对于设备控制键或组合键,例如capsLock、alt、ctrl  不会触发该事件
在keydown中,会对所有键都会触发事件,并有对应的虚拟码

在keypress中,对于alt和ctrl这样的组合键,需要通过
ctrlKey   altKey 的值来判断  

事件流是什么东西?

事件是可以流动的,它在触发时,默认情况下,会将事件向父元素进行传播,导致外层也被依次触发,直到页面的最顶层元素。 事件函数的执行顺序按照事件传播的顺序进行。
我们管这种现象叫做: 事件冒泡

当然,事件流能从子到父传播(冒泡)也能从父到子进行传播

什么叫冒泡

好处在哪? (事件委托机制)
把元素触发事件时要执行的动作委托给父元素来执行,应用场景:
1、需要添加事件的子元素太多  2、子元素数量不固定


注: 通过event.target属性,我们可以找到事件触发的原始对象

坏处在哪?

事件冒泡给父元素,会导致一些不该触发的事件被触发了

怎么阻止事件传播?

event.stopPropagation()  //常规浏览器,是一个方法
event.cancelBubble = true;  //  IE中设置,是一个boolean值默认为false
兼容性:


如何阻止右键菜单

document.oncontextmenu = function(e){
     e = e || event;
     e.preventDefault ? e.preventDefault() : e.returnValue = false;    //  常规浏览器 || IE
}

浏览器的默认行为有哪些? 能阻止吗?

右键弹出菜单
超链接的页面跳转
按钮(button,type不一定是submit)在表单中的自动提交
e.preventDefault ? e.preventDefault() : e.returnValue = false;

拖拽原理

ele.onmousedown = function(){
     document.onmousemove = function(){
          //..........
     }
}
document.onmouseup = function(){
     document.onmousemove = null;
}

事件捕获又是什么东西? 

与事件冒泡的执行顺序相反的事件特性
从最顶层父元素依次向子元素

另外一种绑定事件的方法?

addEventListener(eventtype, func,  isCapture) //IE8及以下无这个方法
参数1 :  事件的类型,注意 不加 on
参数2 :  事件需要绑定的函数
参数3 :  是否支持捕获,默认为false,即冒泡

//结果只有small03

//会弹出01 02 03 ,三个都会生效
可以给同一个元素绑定多个事件函数!!,一般多人开发的时候选用的就是以addEventListener
方式添加事件,避免覆盖别人的事件


参数三的使用:

// window   document  small01  big
多个事件的执行顺序和事件绑定的顺序一致
   

删除操作如下:



  // window  document small01 big  (先捕获再冒泡)


先捕获(网景对抗IE)再冒泡(IE)

small.attachEvent("onclick",function(){}) //IE8及以下
 //兼容IE8及以下,无第三个参数,虽然也能重复添加同一事件,但执行顺序与添加顺序是相反的

捕获的过程(定义函数如:onclick)不会向下传播

兼容封装1://对象,事件名,方法,是否捕获 ,缺点每次使用都要判断

兼容封装2:只在加载时做一次判断(函数自运行),这也叫作:函数的柯里化


鼠标跟随示例:

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>Document</title>  
	<style>
		div{height:10px;width:10px;position:absolute;background:#000;}
		
	</style>
</head>  
<body id="_body">  
	 
	<div style="left: 341px; top: 172px;"></div>
	<div style="top: 172px; left: 341px;"></div>
	<div style="top: 69px; left: 272px;"></div>

</body>  
<script>
	var _div=Array.from(document.getElementsByTagName('div'));// ES6中伪数组转为数组
	
	document.οnmοusemοve=function(e){
		var e = e || event;
		var _last=_div.pop();
		_last.style.top = e.clientY+"px";
		_last.style.left = e.clientX+"px";
		_div.unshift(_last);

	}
</script>


</html>  

冒泡示例
<!DOCTYPE html>
<html>
	
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>DOM操作</title>	
	</head>
	<style>
		
	</style>
	<script src="js/common.js"></script>
	<body>
		<div id="big" style="position:absolute; width:400px; height:400px; background: #cdf">
			<div id="small" style="position:absolute; left:500px; top:300px; width:200px; height:200px; background: blue"></div>
		</div>
		
		<script>
			window.onclick = function(){
				alert("window");
			}
			big.onclick = function() {
				alert("big");
			}
			document.documentElement.onclick = function() {
				alert("html");
			}
			document.body.onclick = function() {
				alert("body");
			}
			small.onclick = function() {
				alert("small");
			}
			
		</script>
	</body>
	
</html>















假设有1000人,每人手里有200块钱,从此刻开始,每过一分钟,每个人都从自己手里拿出一块钱,随机发给别人。
(1、允许负债,2、当你的钱数为0时,从队伍中消失)
以下实现条件2
<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>Document</title>  
	<style>
		div{height:20px;width:40px;float:left;background:#000;color:#fff;line-height:20px;margin:10px;text-align:center;}	
	</style>
	<script>
	οnlοad=function(){
			(function _init(){ //初始化
				var frag = document.createDocumentFragment();
				for(var i = 0;i <1000;i++ ){	//初始为有1000人
					var tmp = document.createElement('div');
					tmp.innerText="200"; //初始时每人200块钱
					tmp.style.background="rgb("+parseInt(Math.random()*255)+","+parseInt(Math.random()*255)+","+parseInt(Math.random()*255)+")";
					frag.appendChild(tmp);
				}
				document.body.appendChild(frag);
			
			})();
			
			(function _play(){
				
				
				var t = setInterval(function(){//定时器,每隔一秒运行一次
					var div_list = Array.from(document.body.children);
					if(div_list.length<=2) clearInterval(t);//当数组人数小于等于2时停止定时器
					div_list.forEach(function(item,index,arr){ //遍历数组
					
						if(parseInt(arr[index].innerText)-1<0){//轮到当前这人,分钱后=0则踢出
							arr[index].remove();
							console.log("数组原来长度:"+div_list.length);
							div_list.splice(index,1);
							console.log("数组长度:"+div_list.length);
						}else{
							arr[index].innerText = parseInt(arr[index].innerText)-1;// 否则钱数减一
						}

							var index_tmp=0;
							while(1){ //将钱随机分给某个人(不能是本人)
								var index_tmp = parseInt(Math.random()*div_list.length);
								if(index_tmp!=index)break;
							}
							arr[index_tmp].innerText = parseInt(arr[index_tmp].innerText)+1; //获得一块
					});
				
				},1000);
			
			})();
		
	}
	
</script>
</head>  
<body>  
</body>  
</html>  

拖拽示例:
<!DOCTYPE html>
<html lang="zh">

	<head>
		<meta charset="UTF-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<meta http-equiv="X-UA-Compatible" content="ie=edge" />
		<title>Document</title>
		<style type="text/css">
			div {
				width: 100px;
				height: 100px;
				background: #CCCCCC;
				position: absolute;
				left: 0px;
				top: 0px;
			}
		</style>
		<script type="text/javascript">
			window.onload = function() {

				function Drag(obj) {
					this.obj = obj;
					this.trail = new Array();
					onmousedown = function(e) {
							e = e || event;
							trail = new Array(0);
							trail.push({
								x: obj.style.left,
								y: obj.style.top
							});
							var offsetMouse = {
								X: e.offsetX,
								Y: e.offsetY
							}
							document.onmousemove = function(e) {
								e = e || event;
								obj.style.left = Math.min(window.innerWidth - obj.offsetWidth, Math.max(0, e.clientX - offsetMouse.X)) + "px";
								obj.style.top = Math.min(window.innerHeight - obj.offsetHeight, Math.max(0, e.clientY - offsetMouse.Y)) + 'px';
								trail.push({
									x: obj.style.left,
									y: obj.style.top
								});
							}
						},
						onmouseup = function() {
							document.onmousemove = "";
							this.fllowTrail();
						},
						fllowTrail = function() { //回到原点
							var t = setInterval(function() {
								if(trail.length == 0) {
									clearInterval(t);
									return;
								}
								var item = trail.pop();
								obj.style.left = item.x;
								obj.style.top = item.y;

							}, 50);
						}

				}

				var _div = Array.prototype.slice.call(document.body.children)[0];
				var drag = new Drag(_div);
				console.log(drag.trail);

			}
		</script>
	</head>

	<body>
		<div>

		</div>

	</body>

</html>






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值