JavaScript Event对象

news2024/11/18 21:48:29

文章目录

  • JavaScript Event对象
    • 概述
    • Event对象属性方法
      • event对象常用属性
      • type
      • keyCode
    • 获取Event对象
        • 兼容代码
    • 获取事件的目标对象
        • target属性和currentTarget属性

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属性才指向同一个元素。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【魅力开源】第2集:三个人每人一个想法会发生什么故事?关于Odoo的江湖

文章目录一. 关于权限控制&#xff1a;组织、角色、人员权限的说明二. 关于快速批量功能&#xff1a;有一些事情可以交给电脑来做三. 关于可以拖拉拽应用&#xff1a;技术模块3.1 可配置的MVC3.2 简单开发下附件模块也可用来作为企业的知识沉淀3.3 多语言支持&#xff1a;对于跨…

第五届“泰迪杯”数据分析技能赛 经验代码分享

第五届“泰迪杯”数据分析技能赛 经验/代码分享 品牌&#xff1a;“泰迪杯”数据分析技能赛 组织单位&#xff1a;泰迪杯数据分析技能赛组织委员会、广东泰迪智能科技股份有限公司、广东省工业与应用数学学会、人民邮电出版社、北京泰迪云智信息技术研究院、网宿科技股份有限…

内存管理详解

目录 一、C/C中内存分布 二、C语言的内存管理方式 三、C的内存管理方式 3.1 new/delete操作内置类型 3.2 new/delete操作自定义类型 3.3 operator new()和operator delete()函数 3.4 重载operator new()和operator delete() 四、new、delete的实现原理 4.1 内置类型 …

(02)Cartographer源码无死角解析-(50) 2D点云扫描匹配→相关性暴力匹配2:RealTimeCorrelativeScanMatcher2D

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

【论文速递】TPAMI2022 - 小样本分割的整体原型激活

【论文速递】TPAMI2022 - 小样本分割的整体原型激活 【论文原文】&#xff1a;Holistic Prototype Activation for Few-Shot Segmentation 获取地址&#xff1a;https://ieeexplore.ieee.org/document/9839487 CSDN下载&#xff1a;https://download.csdn.net/download/qq_36…

三十、RabbitMQ(1)

&#x1f33b;&#x1f33b; 目录一、 关于中间件的概述二、基于消息中间件的分布式系统的架构2.1 消息中间件应用的场景2.2 常见的消息中间件2.3 消息中间件的本质及设计2.4 消息中间件的核心组成部分2.5 小总结三、消息队列协议3.1 什么是协议3.2 网络协议的三要素3.3 AMQP 协…

JAVA 23种设计模式示例

目录 一.单例模式 二.工厂方法模式 三.抽象工厂模式 四.建造者模式 五.原型模式 六.享元模式 七.门面模式 八.适配器模式 九.装饰者模式 十.策略模式 十一.模板方法模式 十二.观察者模式 十三.责任链模式 十四.代理模式 十五.桥接模式 十六.组合模式 十七.命令…

openGauss数据库PostGIS 安装与使用

目录 概述 1.PostGIS 安装 1.1 GCC-7.3编译器安装 1.2PostGIS依赖库安装 1.3.安装Postgis 2.使用Extension 2.1创建PostGIS Extension 2.2使用Extension 2.3删除Extension 概述 PostGIS Extension是PostgreSQL的空间数据库扩展&#xff0c;提供如下空间信息服务功能&…

SpringBoot+VUE前后端分离项目学习笔记 - 【21 权限菜单 中】

1 新建了sys_dict表以及相应Dict类保存菜单menu的icon数据 2 新建了sys_role_menu表以及相应RoleMenu类保存前端Role页面传来的角色菜单ID的绑定关系 3 在MenuController里增加获取Dict里icon的方法 提供前端菜单页面显示 4 在RoleController增加Post接口&#xff0c;获取前台传…

66页3万字医疗行业大数据治理解决方案

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 目 录 1. 1、医疗行业大数据管…

分享116个PHP源码,总有一款适合您

PHP源码 分享116个PHP源码&#xff0c;总有一款适合您 116个PHP源码链接&#xff1a;https://pan.baidu.com/s/1dsupZiZbKqvHPmlpIAgWqA?pwdg52q 提取码&#xff1a;g52q import os import shutil import time from time import sleepimport requests from bs4 import Bea…

C++11静态断言static_assert

C11静态断言static_assert一、运行时断言二、静态断言的需求三、静态断言四、单参数版本的静态断言一、运行时断言 断言&#xff08;assertion&#xff09;是一种编程中常用的手段。在通常情况下&#xff0c;断言就是将一个返回值总是需要为真的判别式放在语句中&#xff0c;用…

Oracle No-Fee Terms and Conditions (NFTC)到底有啥条款?

1995年Sun微系统公司推出Java至今已有28年的历史&#xff0c;由于厂商持续升级优化&#xff0c;使用场景广阔&#xff0c;生态完善&#xff0c;Java目前仍然保持着非常旺盛的生命力。 付费许可 2019年java更新了许可政策 https://www.oracle.com/java/technologies/javase/ja…

【一文速通】机器学习样本不均衡/数据分布不同怎么办?

样本不均衡是什么意思样本&#xff08;类别&#xff09;样本不平衡&#xff08;class-imbalance&#xff09;指的是分类任务中不同类别的训练样例数目差别很大的情况&#xff0c;一般地&#xff0c;样本类别比例&#xff08;Imbalance Ratio&#xff09;&#xff08;多数类vs少…

antd中Tree组件使用方法个人笔记

一、前言 最近在自己自学前端&#xff0c;不清楚学习路线&#xff0c;只能盯着公司的前端项目硬看。 公司的前端项目是react框架&#xff0c;Ant Design Pro。 之前刚把router.config.js的逻辑理顺&#xff0c;目前准备开发个简单的前端页面。 在此总结下antd中<Tree>…

【算法刷题 DAY04】剑指offer树3和队列与栈总结

JZ36 二叉搜索树与双向链表 描述 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。如下图所示 注意: 1.要求不能创建任何新的结点&#xff0c;只能调整树中结点指针的指向。当转化完成以后&#xff0c;树中节点的左指针需要指向前驱&#xff0c;树中…

虹科新闻 | 虹科与weeve正式建立合作伙伴关系

近日&#xff0c;虹科与weeve正式建立合作伙伴关系&#xff0c;双方就工业应用自动化领域进行深入的交流与合作&#xff0c;未来将共同致力于为中国市场提供完整的物联网边缘服务解决方案&#xff0c;解决中国客户的物联网挑战。 虹科与weeve都表示十分期待这次的合作。“虹科…

day36【代码随想录】贪心算法之根据身高重建队列、用最少数量的箭引爆气球、无重叠区间

文章目录前言一、根据身高重建队列&#xff08;力扣406&#xff09;二、用最少数量的箭引爆气球&#xff08;力扣452&#xff09;三、无重叠区间&#xff08;力扣435&#xff09;前言 1、根据身高重建队列 2、用最少数量的箭引爆气球 3、无重叠区间 一、根据身高重建队列&…

魔改插线板,让电视控制周边设备开关机

一.我的需求 本人是一个极简主义风格的人&#xff0c;自从用了N1盒子刷了coreELEC 系统后&#xff0c;就不断的进行折腾&#xff0c;跟大家说下我的心路历程。 1.我家很少看电视&#xff0c;不想因为偶尔开一次电视就每个月交24块钱&#xff0c;所以把广电的机顶盒停掉了。 2.电…

TextView

1.简介 向用户显示文本的用户界面元素。 2.常见使用 2.1 设置文本内容 //xml 硬编码 <TextView android:text"文本"/> //xml 推荐放在string.xml,为了国际化考虑 <TextView android:text"string/app_name"/> //kotlin tv.text getStr…