事件

什么是事件

事件是可以被JavaScript侦测到的行为。网页中的每个元素都可以产生某些可以触发JavaScript函数的事件

事件绑定方式

格式:节点.on+事件名 = 事件处理函数;

//节点绑定方式会同名事件被覆盖
div.onclick = function(){}

事件分类

鼠标事件

onclick: 当用户点击某个对象时调用的事件。

click = mousedown + mouseup

ondblclick :当用户双击某个对象时调用的事件。

dblclick = click*2(短时间内两次单击)

onmousedown :鼠标按钮被按下。
onmouseup: 鼠标按键被松开。

onmouseover :鼠标移到某元素之上。
onmouseout: 鼠标从某元素移开。
onmousemove :鼠标被移动时触发。
onmouseenter :在鼠标光标从元素外部移动到元素范围之内时触发。这个事件不冒泡
onmouseleave: 在位于元素上方的鼠标光标移动到元素范围之外时触发。这个事件不冒泡

执行顺序:mouseover=>mouseenter; mouseout => mouseleave

oncontextmenu :鼠标右键菜单展开时触发

键盘事件

onkeydown :某个键盘按键被按下。
onkeyup: 某个键盘按键被松开。
onkeypress: 键盘<字符键>被按下,而且如果按住不放的话,会重复触发此事件。

UI事件

onload :页面元素(包括图片多媒体等)加载完成后
onscroll: 滚动时触发。
onresize :窗口或框架被重新调整大小。

表单事件

onblur:元素失去焦点时触发。
onfocus :元素获得焦点时触发。
onchange :元素内容被改变,且失去焦点时触发。
oninput: 输入字符时触发
onreset :重置按钮被点击。
onsubmit :确认按钮被点击。
onselect :输入框文本被选中。

Event对象

获取event对象

标准:事件处理函数的第一个参数

div.onclick = function(e){
	console.log(e);//输出event对象信息
}

IE8-:window.event

//获取event对象的兼容写法
e = e || window.event;

鼠标事件Event属性

event.button 返回当事件被触发时,哪个鼠标按钮被点击。
W3C标准
0: 代表鼠标按下了左键
1: 代表按下了滚轮
2: 代表按下了右键

IE8-(IE8以下的浏览器)
1鼠标左键, 2鼠标右键, 3左右同时按, 4滚轮, 5左键加滚轮, 6右键加滚轮, 7三个同时

键盘事件Event属性

event.which/event.keyCode 获取键盘事件
对于keypress事件,该属性声明了被敲击的键生成的 Unicode 字符码(ascii码)

对于keydown和keyup事件,它指定了被敲击的键的虚拟键盘码。

onkeydown的常用键盘键值

  1. 左 37
  2. 上 38
  3. 右 39
  4. 下 40
  5. Esc 27
  6. 空格 32
  7. 回车 13

altKey: 返回当事件被触发时,ALT 键是否被按下。
ctrlKey :返回当事件被触发时,CTRL 键是否被按下。
shiftKey :返回当事件被触发时,Shift 键是否被按下。

光标位置信息

event.clientX…(其余一样)

clientX /clientY 光标相对于浏览器可视区域的位置,也就是浏览器坐标。
screenX/screenY 光标指针相对于电脑屏幕的水平/垂直坐标。
pageX/pageY:鼠标相对于文档的位置

pageX:包括滚动条滚动的距离,即:clientX+window.scrollX,IE8-不支持

offsetX,offsetY: 光标相对于事件源对象的相对偏移量。
事件源对象:触发事件的对象

Event公共属性

type:被触发的事件的类型(一般用于判断)
currentTarget:其事件处理程序当前正在处理事件的那个元素

事件冒泡

什么是事件冒泡:
在一个对象上触发某类事件(如onclick事件),那么click事件就会沿着DOM树向这个对象的父级传播,从里到外,直至它被处理程序处理,或者事件到达了最顶层(document/window)

事件源对象:触发事件的元素
标准:event.target
IE8-:event.srcElement

停止事件的传播
标准:event.stopPropagation();
IE8-:event.cancelBubble = true;

1)不是所有的事件都能冒泡。以下事件不冒泡:blur、focus、load、unload…。
2)冒泡到最顶层的目标不同。大部分浏览器到window对象,IE8-到document对象

<style>
	.katsuki{width:200px;height:100px;background-color: #58bc58;}
</style>
<script>
window.onload = fuction(){
	var katsuki = document.getElementsByClassName('katsuki');
	katsuki.onclick = function(){
		console.log('katsuki');
	}
	//body
	document.body.onclik(e){
		console.log('body');
		//兼容获取event
		e = e || window.event;
		// 被处理:停止事件的传播
		e.stopPropagation();
	}
	//html
	document.documentElement.onclick(e){
		console.log('html');
		//事件源对象
		console.log(e.target);
	}
	//document
	document.onclick = function(e){
		console.log('document');
		//事件源对象
		console.log(e.target);
	}
	//window
	window.onclick = function(e){
		console.log('window');
		//事件源对象
		console.log(e.target);
	}
	/*
		由于冒泡是沿着DOM树向这个对象的父级传播
		因此得到 div body html document window输出顺序
		和代码顺序无关,打乱各层的onclick代码顺序得到相同结果

		body中e.stopPropagation();没被注释时,输出 katsuki body
		被注释时,输出 
		katsuki 
		body 
		html <div class="katsuki"></div>
		document <div class="katsuki"></div>
		window <div class="katsuki"></div>
	*/
}
</script>
<body>
	<div class="katsuki"></div>
</body>

阻止浏览器默认行为

链接跳转
表单提交
右键菜单…
文本的选择

标准:event.preventDefault();
IE8-:event.returnValue = false;

事件监听与捕获(反冒泡)

事件监听器(同名事件不会被覆盖,且支持捕获)

格式:元素.addEventListener(事件名,事件处理函数,是否捕获)
target.addEventListener(“click”, fn, false);
可以绑定多个处理函数在一个对象上, 执行顺序按照绑定的顺序来

不同元素事件执行顺序跟html结构有关
相同元素事件执行顺序跟绑定先后有关

第三个参数是否使用捕获(反向冒泡),默认false,为冒泡

IE8-的事件监听器:
格式:元素.attachEvent(on+事件名,事件处理函数)
target.attachEvent(“onclick”,fun);
可以绑定多个函数在一个对象上, 执行顺序按照绑定的反序

<script>
window.onload = function(){
	var katsuki = document.getElementById('katsuki');
	var span = katsuki.children[0];
	//事件监听方式绑定事件
	//katsuki
	katsuki.addEventListener('click',function(){
		console.log('katsuki');
	});
	//span
	span.addEventListener('click',function(){
		console.log('span');
	});
	//body
	document.body.addEventListener('click',funtion(){
		console.log('body');
	});
	//html
	document.documentElement.addEventListener('click',function(){
		console.log('html');
	},true);
	//document
	document.addEventListener('click',function(){
		console.log('document');
	},true);
	//window
	window.addEventListener('click',function(){
		console.log('window');
	});
	/*
		没有设置捕获为true时,事件冒泡,同理上面输出方式:
		span katsuki body html document window
		设置了捕获为true时,事件根据DOM树结构倒序提前,所以上面代码输出:
		document html span katsuki body window
	*/
}
</script>
<body>
	<div id="katsuki">
		<span></span>
	</div>
</body>

移除

标准:
removeEventListener(‘click’,fn, true)
传入的所有参数(包括函数)必须与事件监听器中一致,否则不能移除事件

IE8-:
detachEvent(‘onclick’,fun)
传入的参数fun要跟添加时一样,否则不能移除事件

注意:
页面事件绑定数量越多,越影响性能(速度越慢)

<style>
	#katsuki{width:300px;box-sizing: border-box;}
</style>
<script>
window.onload = function(){
	var katsuki = document.getElementById('katsuki');
	var btnRemove = document.getElementById('btnRemove');
	var btnRemove2 = document.getElementById('btnRemove2');
	
	//节点方式绑定
	katsuki.onclick = function(){
		console.log('katsuki');
	}
	//节点方式移除
	btnRemove.onclick = function(){
		katsuki.onclick = null;
	}
	//鼠标移入移出事件添加样式,删除绑定
	//监听方式绑定
	//需要移除事件时,事件处理函数必须单独编写,这样才能是移除事件效果
	var handler = function(){
		katsuki.style.border = '10px solid #f00';
	}
	katsuki.addEventListener('mouseover',handler);
	katsuki.addEventListener('mouseout',function(){
		katsuki.style.border = 'none';
	});
	btnRemove2.onclick = function(){
		katsuki.removeEventListener('mouseover',handler);
	}
}
</script>
<body>
	<p>
		<button id="btnRemove">移除节点绑定方式</button>
		<button id="btnRemove2">移除事件监听器绑定方式</button>
	</p>
	<img src="img/katsuki.jpg" id="katsuki">
</body>

拖拽案例

拖拽的原理

鼠标按下且移动鼠标时,改变当前元素的top,left值

拖拽的思路

1给目标元素添加onmousedown事件

拖拽的前提是目标元素设置css定位

记录按下鼠标位置与元素左上角的偏移量
ox = offsetX, oy = offsetY
ox = clientX-offsetLeft, oy=clientY-offsetTop

2当onmousedown发生以后,此刻给document添加onmousemove事件

意味着此刻鼠标在网页的移动都将改变目标元素的位置

在onmousemove事件中,设定目标元素的left和top:
公式
目标元素的left = 鼠标的clientX – offsetX
目标元素的top = 鼠标的clientY– offsetY

3给document添加onmouseup事件,清空document的onmousemove事件

意味着拖动过程中鼠标在网页的任意位置松开鼠标,都会放弃拖拽的效果

<style>		
	#katsuki{position:absolute;top:100px;left:100px;width:100px;height:100px;}
</style>
<script>
window.onload = function(){
	/*鼠标按下移动拖动元素,松开取消拖动*/
	// 事件绑定了就会一直存在,移动事件就需要移除
	katsuki.onmousedown = function(event){
		// 按下时记录光标位置与,事件源对象的偏移量
		ox = event.offsetX;
		oy = event.offsetY;
		// move绑定给document是防止鼠标移动过快移出元素停止拖动
		// 绑定给katsuki就会有鼠标移动过快移出元素停止拖动问题
		document.onmousemove = function(e){
			// 移动中不断改变元素的left和top值
			katsuki.style.left = e.pageX - ox + 'px';
			katsuki.style.top = e.pageY - oy + 'px';
			// img移动在浏览器里有默认行为,需要清除
			e.preventDefault();
		}
	}
	// 松开鼠标移除移动事件绑定
	document.onmouseup = function(){
		document.onmousemove = null;
	}
}
</script>
<body>
	<!--了解 draggable="false" img移动在浏览器里有默认行为属性,设置为false可清除-->
	<img src="img/katsuki.jpg" id="katsuki">
</body>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值