我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JS中的事件对象Event实例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JS中的事件对象Event实例分析

这篇文章主要讲解了“JS中的事件对象Event实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS中的事件对象Event实例分析”吧!

JS中的事件对象Event实例分析

一、什么是事件对象 Event

  每一个事件触发时,都会产生一个与之对应的事件对象 event ,其中包含了触发事件的元素、键盘鼠标的状态、位置等等内容。

  每当用户触发一个事件后,JS 就会自动生成一个 event 对象,根据触发事件的不同,这个对象包含的内容也不同,比如通过鼠标触发点击事件,会产生一个 MouseEvent 对象,其中包含了鼠标的位置等内容;通过键盘触发事件,会产生一个 KeyboardEvent 对象其中包含按键相关的信息。

  • event 对象代表事件的状态,比如触发事件的元素、键盘按键的状态、鼠标的位置、鼠标按键的状态等等;

  • event 对象是一个隐式参数,并且只在事件发生的过程中才有效;

  • event 对象根据触发方式的不同会具有不同的属性,也就是说某些属性只对特定事件有效,但所有内容都是继承自 Event 对象;

  • event 对象在 IEChrome 等浏览器表现不尽相同,例如说 event.target 表示触发事件的元素,在 IE 中需要使用 event.class="lazy" data-srcElement 获取;

Event对象本身就是一个构造函数,可以用来生成新的实例。

event = new Event(type, options);

Event构造函数接受两个参数。第一个参数type是字符串,表示事件的名称;第二个参数options是一个对象,表示事件对象的配置。该对象主要有下面两个属性。

  • bubbles:布尔值,可选,默认为false,表示事件对象是否冒泡。

  • cancelable:布尔值,可选,默认为false,表示事件是否可以被取消,即能否用Event.preventDefault()取消这个事件。一旦事件被取消,就好像从来没有发生过,不会触发浏览器对该事件的默认行为。

var ev = new Event(
  'look',
  {
    'bubbles': true,
    'cancelable': false
  }
);
document.dispatchEvent(ev);

上面代码新建一个look事件实例,然后使用dispatchEvent方法触发该事件。

注意,如果不是显式指定bubbles属性为true,生成的事件就只能在“捕获阶段”触发监听函数。

// HTML 代码为
// <div><p>Hello</p></div>
var div = document.querySelector('div');
var p = document.querySelector('p');

function callback(event) {
  var tag = event.currentTarget.tagName;
  console.log('Tag: ' + tag); // 没有任何输出
}

div.addEventListener('click', callback, false);

var click = new Event('click');
p.dispatchEvent(click);

上面代码中,p元素发出一个click事件,该事件默认不会冒泡。div.addEventListener方法指定在冒泡阶段监听,因此监听函数不会触发。如果写成div.addEventListener('click', callback, true),那么在“捕获阶段”可以监听到这个事件。

另一方面,如果这个事件在div元素上触发。

div.dispatchEvent(click);

那么,不管div元素是在冒泡阶段监听,还是在捕获阶段监听,都会触发监听函数。因为这时div元素是事件的目标,不存在是否冒泡的问题,div元素总是会接收到事件,因此导致监听函数生效。

二、Event 属性

  我们在前面提到,根据触发方式的不同 event 对象会具有不同的属性,我们可以将其大体分为四部分:

通用属性 (无论是通过键盘还是鼠标触发都拥有的属性)

  • bubbles 事件是否会冒泡,布尔值;

  • cancelable 事件是否具有默认行为,布尔值;
      默认行为指的是浏览器中规定的一些行为,比如 <a> 标签点击后会跳转链接,<form> 标签内按回车会自动提交等等。

  • currentTarget 事件处理程序当前正在处理事件的那个元素,返回一个 Element 对象;

  • defaultPrevented 事件是否取消了默认行为,布尔值;

  • detail 返回一个包含事件详细信息的数字
      在 clickmousedownmouseup 事件中,该数字表示当前的点击次数, dblclick 事件中,该数字一直为 2 。在键盘事件和鼠标经过事件中,该数字一直为0。

  • eventPhase 返回一个代表事件处理程序发生时所在阶段的数字;
      0表示当前阶段未发生其他事件;1表示当前事件在捕获阶段发生;2表示当前事件处于目标阶段;3表示当前事件处于冒泡阶段;

  • isTrusted 表示该事件是由用户行为触发的,还是由 JS 代码触发的,布尔值;
      当事件是由用户行为(点击等)触发时,值为 true ,当事件是通过 EventTarget.dispatchEvent() 派发的时候,这个属性的值为 false

<ul>
    <li>列表1</li>
    <li>列表2</li>
    <li>列表3</li>
    <li>列表4</li></ul><script>
    document.querySelector('ul').addEventListener("click", fn1, true)

    document.querySelector('ul').addEventListener("click", fn1, false)

    document.querySelector("li").addEventListener("click", fn1, true)

    function fn1() {
        console.log(this);		// 打印当前事件对象
        console.log(event.eventPhase);		// 打印
    }</script>

  点击列表1后,控制台打印如下结果:
JS中的事件对象Event实例分析

  • target 返回触发该事件的目标节点,返回一个 Element 对象;
      target 并不一定与 this 指向相同,this 指向的是当前发生事件的元素,而 target 指向的是触发该事件的元素,可以将上方代码中的 console.log(event.eventPhase); 换成 console.log(event.target); 来具体体验一下两者的不同。
      在 IE 浏览器中应使用 class="lazy" data-srcElement 来代替 target

  • type 返回触发的事件名称,例 clickkeydown等;

鼠标属性

  • button 当事件被触发时,哪个鼠标按钮被点击;

  • clientX 当事件被触发时,鼠标指针的 x 轴坐标;

  • clientY 当事件被触发时,鼠标指针的 y 轴坐标;

  • screenX 当事件被触发时,鼠标指针的 x 轴坐标;

  • screenY 当事件被触发时,鼠标指针的 y 轴坐标;

键盘属性

  • altKey 当事件被触发时,“Alt” 是否被按下;

  • ctrlKey 当事件被触发时,“Ctrl” 是否被按下;

  • metaKey 当事件被触发时,“meta” 是否被按下;

  • shiftKey 当事件被触发时,“Shift” 是否被按下;

  • Location 返回按键在设备上的位置;

  • charCode 当事件被触发时,触发键值的字母代码;

  • key 按下按键时返回按键的标识符;

  • keyCode 返回 keypress 事件触发的键的值的字符代码,或者 keydownkeyup 事件的键的代码;

  • which 返回 keypress 事件触发的键的值的字符代码,或者 keydownkeyup 事件的键的代码;

  • relatedTarget 返回与事件的目标节点相关的节点。

IE属性

  • cancelBubble 如果想阻止事件冒泡,必须把该属性设为 true

  • fromElement 对于 mouseovermouseout 事件,fromElement 引用移出鼠标的元素;

  • returnValue 等同于 defaultPrevented

  • class="lazy" data-srcElement 等同于 target

  • toElement 对于 mouseovermouseout 事件,该属性引用移入鼠标的元素;

  • x 事件发生的位置的 x 坐标;

  • y 事件发生的位置的 y 坐标;

三、Event 方法

  • initEvent() 初始化新创建的 Event 对象的属性;

  • preventDefault() 阻止触发事件元素的默认行为;

  • stopPropagation() 阻止事件冒泡;

  如果想要阻止事件元素的默认行为,例如点击 <a> 标签时执行点击事件,不要跳转链接,需要在事件处理程序中调用 preventDefault 方法:

<a href="http://baidu.com">百度一下,你就知道</a>
<script>
	document.querySelector("a").onclick = function () {
		event.preventDefault();
		//	do something
	}
</script>

  如果想要阻止事件冒泡,例如点击子元素标签时执行子元素的点击事件,而不想要执行父级元素的事件处理程序,则需要调用 stopPropagation 方法:

<ul>
	<li>不要触发 ul 的点击事件处理程序</li>
</ul>
<script>
	document.querySelector("ul").onclick = function () {
		alert("事件冒泡,触发 ul 的点击事件")
	}

	document.querySelector("li").onclick = function () {
		event.stopPropagation();
		// do something
	}
</script>

其他相关方法

  • addEventListener() 给目标元素注册监听事件;

  • createEvent() 创建一个 Event 对象;

  • dispatchEvent() 将事件发送到目标元素的监听器上;

  • handleEvent() 把任意对象注册为事件处理程序;

  • initMouseEvent() 初始化鼠标事件对象的值;

  • initKeyboardEvent() 初始化键盘事件对象的值;

  • initMutationEvent() 初始变动事件和 HTML 事件对象的值;

  • initCustomEvent() 初始自定义事件对象的值;

  • removeEventListener() 删除目标元素上的某个监听事件;


另外关于 createEvent 方法,根据传入参数的不同,会返回不同的 event 对象:

  • MouseEvents 创建鼠标事件对象,返回的对象中包含 initMouseEvent() 方法;

  • KeyboardEvent 创建键盘事件对象,返回的对象中包含 initKeyEvent() 方法;

  • KeyEventsfirefox 中创建键盘事件对象需要传入该参数;

  • MutationEvents 模拟变动事件和 HTML 事件的事件对象,返回的对象中包含 initMutationEvent 方法;

  • CustomEvent 创建自定义事件对象,返回的对象中包含 initCustomEvent() 方法;

四、模拟事件

4.1 模拟鼠标事件

  我们可以通过 createEvent() 方法可以创建一个新的 event 对象,借助 initMouseEvent() 方法来对这个鼠标事件对象的值进行初始化,该方法接受十五个参数,分别与鼠标事件中的各个属性一一对应,按照 typebubblescancelableviewdetailscreenXscreenYclientXclientYctrlKeyaltKeyshiftKey、、metaKeybuttonrelatedTarget 的顺序传入即可:

var oBtn = document.querySelector("button");
// 为 button 绑定事件处理程序
oBtn.addEventListener("click", function () {
    console.log(event);
})

var event = document.createEvent("MouseEvents");
// 通过 initMouseEvent() 方法初始化鼠标事件的 event 对象
event.initMouseEvent("click", true, true, document.defaultView, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
// 通过 dispatchEvent() 方法来触发 oBtn 上绑定的点击事件,此时浏览器打印的 event 对象为自定义的 event
oBtn.dispatchEvent(event);

  初始化事件对象时,最重要的是前四个参数,因为浏览器在触发事件时,这四个参数是必须的,而剩余的参数只有在事件处理程序中才会被使用,target 会在执行 dispatchEvent 方法时自动赋值;

4.2 模拟键盘事件

  同样需要先使用 createEvent() 方法可以创建一个新的 event 对象,但需要使用 initKeyEvent 来对键盘事件对象的值进行初始化,该方法接收八个参数,分别于键盘事件对象中的各个属性一一对应,按照 typebubblescancelableviewkeylocationmodifiersrepeat的顺序传入即可。但在 firefox 中,需要按照 typebubblescancelableviewctrlKeyaltKeyshiftKey metaKey keyCode charCode ` 的顺序传入十个参数

document.onkeydown = function () {
    console.log(event);
}

var event = document.createEvent("KeyboardEvent");
event.initKeyboardEvent("keydown", false, false, document.defaultView, "a", 0, "Shift", 0);
document.dispatchEvent(event);

4.3 模拟其他事件

  如果想要模拟其他事件,诸如 submitfocusHTML 和变动事件,则需要通过 MutationEvents 方法来创建事件,通过 initEvent 方法来进行初始化,按照typebubblescancelablerelatedNodepreValuenewValueattrNameattrChange的顺序传入参数。

<input type="text">

<script>
    var oInput = document.querySelector("input");
    oInput.addEventListener("focus", function () {
        this.style.background = "#ccc"
    })
    var event = document.createEvent("HTMLEvents");
    event.initEvent("focus", true, false);
    oInput.dispatchEvent(event);
</script>

4.4 自定义 DOM 事件

  自定义事件不是由 DOM 原生触发的,它的目的是让开发人员创建自己的事件。要创建新的自定义事件,可以调用 createEvent("CustomEvent"),返回的对象有一个名为 initCustomEvent() 的方法,接收 typebubblescancelabledetail 四个参数。

var oInput = document.querySelector("input");

oInput.addEventListener("myEvent", function () {
	console.log(event);
})

var event = document.createEvent("CustomEvent");
event.initCustomEvent("myEvent", true, false, "自定义事件myEvent");
oInput.dispatchEvent(event);

  上方代码创建了一个自定义事件,事件名为 myEvent , 该事件可以向上冒泡,不可以执行在浏览器中的默认行为, detail 属性的值为 自定义事件myEvent,可以在绑定该事件的元素或者元素的父级元素上绑定事件处理程序来查看 event 对象。

五、Event的兼容性处理

  主要考虑到 IE 浏览器与 Chrome 等浏览器事件对象的区别,针对下面四个属性,需要进行特殊处理:

  • 获得 event 对象
    var event = event || window.event;

  • 获得 target 对象
    var target = event.target || event.class="lazy" data-srcElement;

  • 阻止浏览器默认行为
    event.preventDefault ? event.preventDefault() : (event.returnValue = false);

  • 阻止事件冒泡
    event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true)。

感谢各位的阅读,以上就是“JS中的事件对象Event实例分析”的内容了,经过本文的学习后,相信大家对JS中的事件对象Event实例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JS中的事件对象Event实例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

js对象和事件的示例分析

这篇文章给大家分享的是有关js对象和事件的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.内置对象1.1 String1.2Math1.3Date说明2.对象2.1 对象的创建JS创建自定义对象,主要通
2023-06-29

Python编程之event对象的用法实例分析

本文实例讲述了Python编程中event对象的用法。分享给大家供大家参考,具体如下: Python提供了Event对象用于线程间通信,它是由线程设置的信号标志,如果信号标志位为假,则线程等待直到信号被其他线程设置成真。这一点似乎和wind
2022-06-04

JS异步编程Promise对象实例分析

这篇文章主要介绍“JS异步编程Promise对象实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JS异步编程Promise对象实例分析”文章能帮助大家解决问题。1、单线程模型单线程模型指的是,
2023-07-02

JS中事件循环机制的示例分析

小编给大家分享一下JS中事件循环机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、JavaScript是单线程的JavaScript 是一种单线程的
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录