百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

JavaScript学习之事件

myzbx 2025-01-10 15:41 29 浏览

1 基本概念

1.1 事件

JavaScript与HTML之间的交互是通过事件实现的。

事件是文档或浏览器窗口中发生的一些特定的交互瞬间,在事件上可以注册处理程序,以便当事件发生时,处理程序中的代码得到执行(这种模型对应设计模式中的观察者模式)。

1.2 事件流

事件流描述的是从页面接受事件的顺序。

2 事件流

2.1 事件冒泡

IE事件流叫做事件冒泡,即事件开始由最具体的元素接受,然后逐渐向上传播到较为不具体的节点。

事件冒泡能够被所有浏览器支持。注意IE5.5及更早版本的事件冒泡会跳过<html>元素(从<body>直接跳到document)。IE9,Firefox,Chrome和Safari则将事件一直冒泡到window对象。

2.2 事件捕获

事件捕获是由不太具体的节点最早接受到事件,而最具体的元素最后接受到事件。事件捕获的用意在于在事件到达预定的目标之前捕获它。

事件捕获不支持老版本的浏览器,但IE9,Firefox,Chrome,Opera和Safari目前都支持这种事件流模型

2.3 DOM事件流

"DOM2事件流"包括三个阶段:事件捕获阶段,处于目标阶段和事件冒泡阶段;在DOM事件流中,实际的目标在捕获阶段不会接受到事件(但IE9、Safari、Chrome、Firefox和Opera 9.5及更高版本都会在捕获阶段触发事件对象上的事件,即有两个机会在目标对象上面操作事件)。

IE9,Firefox,Chrome,Opera和Safari都支持DOM事件流;IE8及更早版本不支持DOM事件流。

3 事件处理程序

事件是用户或浏览器自身执行的某种动作,常见的事件有click,focus,load;而响应事件的函数叫做事件处理程序(或事件侦听器)。事件处理程序的名字以"on"开头,例如click事件对应的事件处理程序就是onclick,focus事件对应的事件处理程序就是onfocus,load事件对应的事件处理程序就是onload。

3.1 HTML事件处理程序

HTML元素支持的每种事件,都可以用一个与相应事件处理程序同名的HTML特性来指定。这个特性的值应该是能够执行的JavaScript代码。例如:

<input type="button" value="click me" onclick="showMessage"/>

HTML中指定事件处理程序有两个缺点:

首先存在时差问题。如果在HTML元素一出现在页面就触发相应的事件,但当时的事件处理程序有可能尚不具备执行条件。具体说来,上例中如果事件处理程序showMessage是在按钮下方,页面底部定义的,当用户在页面解析该函数之前就单击了按钮,就会引发错误;

另一个缺点是,这样扩展事件处理程序的作用链在不同浏览器中会导致不同结果。

通过HTML指定事件处理程序的另一个缺点是HTML和JavaScript代码紧密耦合。如果要更换事件处理程序,需要同时改动两个地方:HTML代码和JavaScript代码。

3.2 DOM0级事件处理程序

指定事件处理程序的传统方式就是将一个函数赋值给一个事件处理程序属性。这种方式优点:1.简单,2.具有跨浏览器的优势。为元素指定事件处理程序分两步:

(1)取得要操作对象的引用;

(2)将该元素的事件处理程序属性如onclick设置为一个函数。示例如下:

<input type="button" value="click me" id="myBtn"/>
<script>
	var btn = document.getElementById('myBtn');
	btn.onclick = function{ alert("I am clicked!"); }
</script>

使用DOM0级方法指定的事件处理程序被认定为是元素的方法,即事件处理程序是在元素的作用域中运行,此时this引用当前元素

删除DOM0级事件处理程序:btn.onclick = null;

3.3 DOM2级事件处理程序

DOM2级事件定义了两个方法,用于处理指定和删除事件处理程序的操作:addEventListener和removeEventListener。这两个方法都接受三个参数:要处理的事件名称,事件处理程序函数,布尔值。其中布尔值为true表示在捕获阶段调用事件处理程序,否则表示在冒泡阶段调用事件处理程序。

与DOM0级事件处理程序一样,DOM2级事件处理程序也是在依附的元素的作用域中运行。使用DOM2级方法添加事件处理程序的好处是可以添加多个事件处理程序。示例如下:

<input type="button" value="click me" id="myBtn"/>
<script>
	var btn = document.getElementById('myBtn');

	btn.addEventListener("click", function{
		alert("first");
	}, false);
	btn.addEventListener("click", function{
		alert("second");
	}, false);
</script>

运行后,先后弹内容为"first"和"second"的对话框,说明可以通过addEventListener为元素添加多个事件处理程序。

通过addEventListener添加的事件处理程序只能通过removeEventListener来移除;移除时传入的参数与添加时传入的参数相同。注意通过addEventListener添加的匿名函数将无法移除

<input type="button" value="click me" id="myBtn"/>
<script>
	var btn = document.getElementById('myBtn');

	btn.addEventListener("click", function{
		alert("first");
	}, false);

	btn.removeEventListener("click", function{	//失效:删除匿名函数并不是同一个函数
		alert("first");
	}, false);

	var secondFunc = function{
		alert("second");
	};
	btn.addEventListener("click", secondFunc, false);
	btn.removeEventListener("click", secondFunc, false);//成功:删除同一个处理函数
</script>

运行后只有一个弹窗,内容为"first",说明在使用removeEventListener删除addEventListener添加的事件处理函数时,必须保证第二个参数非匿名函数。

DOM2级事件处理程序的添加大多数都是在事件的冒泡阶段(第三个参数为false),这样可以最大限度地兼容各种浏览器。

IE9,Firefox,Chrome,Opera和Safari支持DOM2级事件处理程序

3.4 IE事件处理程序

IE实现了与DOM中类似的两个方法:attachEvent和detachEvent。这两个方法接受相同的两个参数:事件处理程序名称和事件处理程序函数。由于IE8及更早的版本只支持事件冒泡,所以通过attachEvent添加的事件处理程序都会被添加到冒泡阶段。

在IE中使用attachEvent与使用DOM0级方法的主要区别是事件处理程序的作用域,使用attachEvent方法的情况下,事件处理程序会在全局作用域运行,因此this === window

attachEvent添加多个事件处理程序,执行顺序与添加顺序相反。

使用attachEvent添加的事件可以通过detachEvent来移除,条件是必须提供相同的参数。与DOM方法一样,添加的匿名函数不能被移除。

支持IE事件处理程序的浏览器有IE和Opera。

3.5 跨浏览器的事件处理程序

要保证事件处理程序在大多数浏览器中一致地运行,只需关注冒泡阶段。

var EventUtil = {
	addHandler: function(element, type, handler){
		if(element.addEventListener){
			element.addEventListener(type, handler, false);
		}
		else if(element.attachEvent){
			element.attachEvent("on" + type, handler);
		}
		else{
			element["on" + type] = handler;
		}
	},
	removeHandler: function(element, type, handler){
		if(element.removeEventListener){
			element.removeEventListener(type, handler, false);
		}
		else if(element.detachEvent){
			element.detachEvent("on" + type, handler);
		}
		else{
			element["on" + type] = null;
		}
	}
};

4 事件对象

4.1 DOM事件对象

兼容DOM(DOM0级和DOM2级)的浏览器会将一个event对象传入到事件处理程序中。

阻止特定的默认行为用preventDefault方法,要立即停止事件在DOM层次中的传播用stopPropagation方法

在事件处理程序中,对象this始终等于currentTarget的值,而target则只包含事件的实际目标

4.2 IE事件对象

与访问DOM中的event对象不同,IE中的event对象有几种不同的方式,取决于指定事件处理程序的方法。

使用DOM0级方法添加事件处理程序时,event作为window对象的一个属性存在;如果使用attachEvent添加事件处理程序,那么就会有一个event对象作为参数被传入事件处理函数中(也可以通过window对象来访问event对象)。

IE的event对象包含于创建它的事件相关的属性和方法。

其中cancelBubble设置为true与DOM中stopPropagation方法的作用相同;

returnValue设置为false与DOM中preventDefault方法的作用相同。

srcElement表示事件的目标,与DOM中target属性相同。

type被触发的事件类型与DOM中type属性相同。

4.3 跨浏览器的事件对象

在前面的EventUtil中添加方法来处理DOM和IE中event对象的差异(以下只展示添加的代码):

getEvent: function(event){
  return event ? event : window.event;
},
getTarget: function(event){
  return event.target || event.srcElement;
},
preventDefalut: function(event){
  if(event.preventDefalut){
    event.preventDefalut;  
	}
  else{
    event.returnValue = false;
  }
},
stopPropagation: function(event){
  if(event.stopPropagation){
    event.stopPropagation;
  }
  else{
    event.cancelBubble = true;
  }
}

相关推荐

别让水 “跑” 出卫生间!下沉设计打造滴水不漏的家

你是否遭遇过卫生间的水“偷偷溜”进客厅,导致木地板鼓起、墙角发霉的糟心事?又是否为卫生间门口反复渗漏,不得不一次次返工维修而头疼不已?在家庭装修中,卫生间防水堪称“兵家必争之地”,而卫生间门口下...

歼-10CE vs 阵风:谁才是空中霸主?全面性能对比解析

歼10CE与法国阵风战斗机性能深度对比分析一、总体定位与设计哲学歼10CE:单发中型多用途战斗机,侧重于空优(制空权争夺)和对地对海打击,具有较高的性价比和较强的多任务能力。法国阵风战斗机:双发中型多...

知名移植工作室肯定Switch2的图形性能,却被CPU拖了后腿

虽然Switch2发售多日,但没入手的玩家对其性能还是有顾虑。近日,知名移植工作室Virtuos的技术总监在接受采访时讨论了Switch2的性能,并给出了他们工作室的评价。简单来说,Switch2在D...

虹科实测 | CAN XL vs CAN FD传输性能深度对比:速率翻倍,抖动锐减!

导读在汽车电子与工业通信领域,CAN协议持续进化,推动着数据传输效率的提升。本次实测基于虹科PCAN-USBXL与虹科PCAN-USBProFD硬件,在同等严苛条件下对比CANXL与CANF...

1J117合金材料优异的耐腐蚀性、机械性能

1J117合金材料概述定义:1J117是一种不锈软磁精密合金,属于铁铬基合金,其圆棒产品具有特定的形状和尺寸,可满足各种工业应用中的特定需求。标准:技术条件标准为GB/T14986,品种规格标准...

据高管所称,Switch2能轻松移植XSS平台60帧游戏

任天堂,作为主机游戏界的御三家之一,一直注重游戏性而不注重更新升级硬件设备是其最大的特点。各位任豚们,忍受着任天堂早已落后硬件设备,真想感叹一句,天下苦任久矣!但Switch2的出现或许正在渐渐的改变...

FJK-110LED-HXJSN磁传感器有哪应用

作为一名从事电子技术相关工作的自媒体人,我经常会遇到各种传感器的应用问题。其中,FJK-110LED-HXJSN磁传感器是一款在工业自动化、智能设备等领域比较常见的磁场检测元件。今天我想和大家聊一聊这...

浅谈欧标方管200x200x5-12mm质S275JRH的优势与劣势

欧标方管200x200x5-12mm材质S275JRH是一种常见的结构用钢材,广泛应用于建筑、机械制造、桥梁、钢结构等领域。本文将对这种方管的优势与劣势进行浅谈,以帮助读者更好地了解其特性和适用场景。...

宽带拨号错误 651 全解析:故障定位与修复方案

在使用PPPoE拨号连接互联网时,错误651提示「调制解调器或其他连接设备报告错误」,通常表明从用户终端到运营商机房的链路中存在异常。以下从硬件、系统、网络三层维度展开排查:一、故障成因分类图...

模型微调:从理论到实践的深度解析

在人工智能领域,模型微调已成为提升模型性能、使其适应特定任务的关键技术。本文将全面系统地介绍模型微调的各个方面,帮助读者深入理解这一重要技术。一、什么是模型微调模型微调是指在已经训练好的预训练模型基础...

汉语拼音 z、c、s图文讲解(拼音字母表zcs教学视频)

以下是汉语拼音z、c、s的图文讲解,结合发音要领、书写规范及教学技巧:一、发音方法与口诀1.z的发音发音要领:舌尖轻抵上齿背,形成阻碍后稍放松,气流从窄缝中挤出,声带不振动(轻短音)。口诀:“写字写...

吴姗儒惹怒刘宇宁粉丝!吴宗宪护航「是综艺梗」叮咛女儿对话曝光

记者孟育民/台北报道Sandy吴姗儒在《小姐不熙娣》因为节目效果,将男星刘宇宁的头像踩在地上,引起粉丝怒火,节目发声明道歉后仍未平息,她也亲自发文郑重道歉:「我对刘宇宁本人完全没有任何恶意,却在综艺表...

苹果错误地发布了macOS Tahoe公开测试版 现已将其撤下

一些Beta测试人员下载了他们以为是macOSSequoia15.6RC的版本,但却错误地下载了macOSTahoe26公开测试版,后来苹果修复了该问题。苹果预计将于7月25...

make的多种用法!(make 的用法总结)

一、make的用法美make[meik]①V.制造;制定,拟定;使变得,使处于;造成,引起;整理(床铺);做,作出;强迫;挑选,任命…②n.(机器、设备等的)品牌,型号;结构,构造;通电,接电⑤[...

北顿尖刀哗变?俄第20近卫集团军损失惨重,拒绝执行指挥官命令?

【军武次位面】作者:太白近日,外国社交媒体“电报”上传出了一些消息,称俄罗斯在北顿涅兹克战场上的“尖刀”部队之一,俄第20近卫集团军因为损失惨重,已经出现了部分部队拒绝执行指挥官命令,甚至哗变的情况。...