JavaScript Event对象

本文介绍了JavaScript中的Event对象,它是事件的核心,包含了事件的相关信息如类型和键盘键码。文章详细讲解了如何获取Event对象,特别是通过event.type获取事件类型和event.keyCode获取键盘键码。此外,还探讨了target属性和currentTarget属性的区别,以及如何在不同浏览器间实现兼容性处理。
摘要由CSDN通过智能技术生成

JavaScript Event对象

概述

事件在浏览器中是以Event对象的形式存在的,每触发一个事件,就会产生一个Event对象。该对象包含所有与事件相关的信息,包括事件的元素、事件的类型及其他与特定事件相关的信息。

Event对象属性方法

event对象常用属性

属性说明
type事件类型
keyCode键盘值
shiftKey是否按下shift键
ctrlKey是否按下ctrl键
alKey是否按下alt键

type

在JavaScript中,当调用一个事件时,JS会给这个事件函数添加一个隐藏对象,也就是event对象。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<script>
			window.onload = function() {
				var oBtn = document.getElementById("btn");
				oBtn.onclick = function(event) {
					console.log(event.type); //click
				}
			}
		</script>
	</head>
	<body>
		<input id="btn" type="button" value="按钮" />
	</body>
</html>

keyCode

按键键码
W87
S83
A65
D68
38
40
37
39
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<script>
			window.onload = function() {
				var direction = document.getElementById("direction");
				window.onkeydown = function(e) {
					if (e.keyCode == 38 || e.keyCode == 87) {
						direction.innerText = "上"
					} else if (e.keyCode == 39 || e.keyCode == 68) {
						direction.innerText = "右";
					} else if (e.keyCode == 40 || e.keyCode == 83) {
						direction.innerText = "下";
					} else if (e.keyCode == 37 || e.keyCode == 65) {
						direction.innerText = "左";
					} else {
						direction.innerText = "";
					}
				}
			}
		</script>
	</head>
	<body>
		<div>方向:<span id="direction" style="color:red;"></span></div>
	</body>
</html>

获取Event对象

在给元素绑定特定的事件处理程序时,可以获取到Event对象,但是考虑到不同浏览器的差异性,获取Event对象的方式也不同。

获取Event对象的方式有以下两种:

  • 在事件处理程序中,Event对象会作为参数传入,参数名为event。
  • 在事件处理程序中,通过window.event属性获取Event对象。
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<script>
			window.onload = function() {
				var direction = document.getElementById("direction");
				window.onkeydown = function(e) {
					var e = e || event; //兼容处理
					if (e.keyCode == 38 || e.keyCode == 87) {
						direction.innerText = "上"
					} else if (e.keyCode == 39 || e.keyCode == 68) {
						direction.innerText = "右";
					} else if (e.keyCode == 40 || e.keyCode == 83) {
						direction.innerText = "下";
					} else if (e.keyCode == 37 || e.keyCode == 65) {
						direction.innerText = "左";
					} else {
						direction.innerText = "";
					}
				}
			}
		</script>
	</head>
	<body>
		<div>方向:<span id="direction" style="color:red;"></span></div>
	</body>
</html>
兼容代码
var EventUtil = {
    // 获取事件对象
    getEvent: function(event) {
        return event || window.event;
    }
};

获取事件的目标对象

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script>
            var EventUtil = {
                // 获取事件对象
                getEvent: function(event) {
                    return event || window.event;
                },
                getTarget: function(event) {
                    return event.target || event.srcElement;
                }
            };
            window.onload = function() {
                var btn = document.getElementById("btn");
                btn.addEventListener("click", function(e) {
                    var event = EventUtil.getEvent(e);
                    var target = EventUtil.getTarget(event);
                    console.log(target);
                });

            }
        </script>
    </head>
    <body>
        <input id="btn" type="button" value="提交">
    </body>
</html>
target属性和currentTarget属性

target属性和currentTarget属性。两者都可以表示事件的目标元素,但是在事件流中两者却有不同的意义。

  • target属性在事件目标阶段,理解为真实操作的目标元素。
  • currentTarget属性在事件捕获、事件目标、事件冒泡这3个阶段,理解为当前事件流所处的某个阶段对应的目标元素。
<!doctype html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<table border="1">
			<tbody>
				<tr>
					<td>这是td的元素</td>
				</tr>
			</tbody>
		</table>
		<script type="text/javascript">
			var EventUtil = {
				// 获取事件对象
				getEvent: function(event) {
					return event || window.event;
				},
				getTarget: function(event) {
					return event.target || event.srcElement;
				}
			};
			// 获取target属性和currentTarget属性的元素标签名
			function getTargetAndCurrentTarget(event, stage) {
				var event = EventUtil.getEvent(event);
				var stageStr;
				if (stage === 'bubble') {
					stageStr = '事件冒泡阶段';
				} else if (stage === 'capture') {
					stageStr = '事件捕获阶段';
				} else {
					stageStr = '事件目标阶段';
				}
				console.log(stageStr,
					'target:' + event.target.tagName.toLowerCase(),
					'	currentTarget: ' + event.currentTarget.tagName.toLowerCase());
			}

			var table = document.querySelector("table");
			var tbody = document.querySelector("tbody");
			var tr = document.querySelector("tr");
			var td = document.querySelector("td");

			// 事件捕获
			table.addEventListener('click', function(event) {
				getTargetAndCurrentTarget(event, 'capture');
			}, true);

			// 事件捕获
			tbody.addEventListener('click', function(event) {
				getTargetAndCurrentTarget(event, 'capture');
			}, true);

			// 事件捕获
			tr.addEventListener('click', function(event) {
				getTargetAndCurrentTarget(event, 'capture');
			}, true);

			// 事件捕获
			td.addEventListener('click', function(event) {
				getTargetAndCurrentTarget(event, 'target');
			}, true);

			// 事件冒泡
			table.addEventListener('click', function(event) {
				getTargetAndCurrentTarget(event, 'bubble');
			}, false);

			// 事件冒泡
			tbody.addEventListener('click', function(event) {
				getTargetAndCurrentTarget(event, 'bubble');
			}, false);

			// 事件冒泡
			tr.addEventListener('click', function(event) {
				getTargetAndCurrentTarget(event, 'bubble');
			}, false);

			// 事件冒泡
			td.addEventListener('click', function(event) {
				getTargetAndCurrentTarget(event, 'target');
			}, false);
		</script>
	</body>
</html>

说明:在事件流的任何阶段,target属性始终指向的是实际操作的元素。因为我们是在td元素上进行的单击操作,所以target属性对应的是td。

在事件流的事件捕获阶段或者事件冒泡阶段,currentTarget指向的是事件流所处的某个特定阶段对应的元素。在该实例中,事件捕获阶段元素的流转顺序为table>tbody>tr,事件冒泡阶段元素的流转顺序为tr>tbody>table。

在事件目标阶段,currentTarget属性指向的也是实际操作的元素,即td。因此只有在事件目标阶段,target属性和currentTarget属性才指向同一个元素。

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值