JavaScript

JavaScript 知识量:26 - 101 - 483

16.4 事件类型><

事件类型- 16.4.1 -

事件类型是指事件发生时所对应的类型标识符,用于指定事件的性质。在DOM中,有很多种事件类型,包括但不限于以下几种:

  • 鼠标事件:包括click、dblclick、mousedown、mouseup、mousemove、mouseover、mouseout等。

  • 键盘事件:包括keydown、keyup、keypress等。

  • 窗口事件:包括load、resize、scroll、unload等。

  • 表单事件:包括submit、reset、focus、blur等。

  • 多媒体事件:包括mediaquery等。

除了以上几种事件类型外,还有其他类型的事件,例如触摸事件、设备事件等。在编写事件处理程序时,需要针对不同的事件类型进行处理。

用户界面事件- 16.4.2 -

用户界面事件是指用户与界面(如网页、应用程序等)交互时产生的事件,例如点击、触摸、拖动、滚动等。这些事件可以被捕获并处理,以响应用户的操作。

以下是一些常见的用户界面事件:

  • click:用户点击某个元素时触发,例如按钮、链接、图片等。

  • doubleclick:用户双击某个元素时触发,例如文本框、图片等。

  • mousedown:用户按下鼠标按钮时触发,通常用于响应鼠标拖动操作。

  • mouseup:用户释放鼠标按钮时触发,通常用于响应鼠标拖动操作。

  • mousemove:用户移动鼠标时触发,通常用于实时跟踪鼠标位置。

  • scroll:用户滚动页面时触发,通常用于响应用户的滚动操作。

  • keypress:用户按下键盘上的字符键时触发,通常用于输入文本或执行特定快捷键。

  • keydown:用户按下键盘上的非字符键时触发,例如导航键(方向键、空格键等)。

  • keyup:用户释放键盘上的键时触发,通常用于执行特定快捷键或处理快捷键组合。

  • touchstart:用户触摸屏幕时触发,通常用于响应触摸操作。

  • touchmove:用户在屏幕上移动手指时触发,通常用于响应触摸拖动操作。

  • touchend:用户释放手指时触发,通常用于响应触摸操作。

这些事件可以通过添加事件监听器来捕获并处理,例如使用JavaScript的addEventListener()方法。在事件处理程序中,可以执行各种操作,例如更新界面、发送请求、跳转页面等。

load事件- 16.4.3 -

load事件是当页面完全加载完成后(包括所有图像、JavaScript文件、CSS文件等外部资源)触发的事件。

该事件不仅发生在document、window对象上,外部资源的加载也能触发load事件,如图片、JS、CSS、音频、视频、Ajax请求等等。如果在页面从浏览器缓存加载,不会触发load事件。

在某些情况下,如动态创建img或js资源时,要注意load事件的触发时机。例如,在动态创建img时,必须先指定事件再设置src属性,否则img的src属性会从设置src属性之后开始下载。同样,js资源也只有在设置了script元素的src属性并将该元素添加到文档后,才会开始下载javascript文件。

此外,如果页面加载过程中发生错误,会触发error事件。任何没有try-catch处理的错误都会触发window对象的error事件。

以下是一个简单的load事件示例:

<!DOCTYPE html>  
<html>  
<body>  
  
<img src="image.jpg" alt="My image" id="myImage">  
  
<script>  
let img = document.getElementById('myImage');  
img.onload = function() {  
  console.log('Image has loaded');  
}  
</script>  
  
</body>  
</html>

在上面的示例中,当图像完全加载完成后,会触发onload事件,并将消息“Image has loaded”打印到控制台中。

unload事件- 16.4.4 -

unload事件发生在窗口关闭或者document对象将要卸载时,该事件发生在window、body、frameset等对象上面。这个事件通常用于执行一些清理操作,例如关闭数据库连接、清除缓存等。

需要注意的是,unload事件只在页面没有被浏览器缓存时才会触发,也就是说,如果通过按下“前进/后退”导致页面卸载,并不会触发unload事件。

在事件处理程序中,可以指定在窗体卸载时应该发生的操作,例如打开另一个窗体或显示一个对话框要求输入用户名称,以便产生一条有关窗体使用者的日志。当关闭窗体时,事件按照以下顺序发生:unload → deactivate → close。unload事件可以取消,但close事件不能取消。

以下是一个简单的unload事件示例:

<!DOCTYPE html>  
<html>  
<body>  
  
<p>Click the "Try it" button to see the unload event:</p>  
  
<button onclick="myFunction()">Try it</button>  
  
<script>  
function myFunction() {  
  alert("Unload event triggered!");  
}  
window.onunload = function() { myFunction(); }  
</script>  
  
</body>  
</html>

在上面的示例中,当页面卸载时,会触发onunload事件,并执行myFunction()函数,显示一个弹出窗口,内容为“Unload event triggered!”。

resize事件- 16.4.5 -

resize事件是当浏览器窗口大小改变时触发的事件。利用该事件可以跟踪窗口大小的变化来动态调整页面的元素显示。例如,当窗口大小改变时,可以重新计算页面的布局并调整元素的大小和位置。

监听resize事件的方法有window.addEventListener和$(window).resize()。由于不同浏览器的兼容性问题和resize事件的频繁触发可能会影响性能,可以使用节流函数来优化resize事件的性能。

在实现中,可以定义一个函数来处理窗口大小变化的事件,该函数会获取窗口的宽度和高度,并重新计算和调整页面的元素大小和位置。例如,可以使用以下代码实现一个简单的resize事件处理程序:

window.addEventListener('resize', function(event) {  
  var width = window.innerWidth;  
  var height = window.innerHeight;  
  console.log('Window size: ' + width + 'x' + height);  
});

在上面的代码中,当窗口大小改变时,会触发resize事件,并获取窗口的宽度和高度,将它们输出到控制台中。可以根据实际需要修改该函数来调整页面的元素显示。

scroll事件- 16.4.6 -

scroll事件是当用户滚动指定的元素时触发的事件。scroll事件适用于所有可滚动的元素和window对象(浏览器窗口)。scroll()方法可以触发scroll事件,或者规定当发生scroll事件时运行的函数。

例如,可以使用以下代码将一个函数绑定到scroll事件:

window.addEventListener('scroll', function() {  
  console.log('Scroll event triggered!');  
});

在上面的代码中,当用户滚动浏览器窗口时,会触发scroll事件,并输出一条消息到控制台中。

焦点事件- 16.4.7 -

焦点事件是指当页面元素获得或失去焦点时触发的事件。在JavaScript中,焦点事件包括focus和blur。当元素获得焦点时,focus事件被触发;当元素失去焦点时,blur事件被触发。这些事件可以用来监听和处理用户与页面元素之间的交互行为。

例如,当用户点击一个输入框时,输入框将获得焦点并触发focus事件。此时,可以执行一些JavaScript代码来响应这个事件,例如验证输入、显示提示信息等。同样,当用户点击输入框外的区域时,输入框会失去焦点并触发blur事件,也可以执行一些JavaScript代码来响应这个事件,例如清除输入、隐藏提示信息等。

除了focus和blur事件,还有其他一些焦点事件,例如focusin和focusout。focusin事件在元素获得焦点时触发,与focus事件等价,但支持冒泡。focusout事件在元素失去焦点时触发,也支持冒泡。这些事件可以用来跟踪用户在页面上的行踪和操作行为。

在使用焦点事件时,需要注意一些细节和限制。例如,不同浏览器对于焦点事件的兼容性不同,有些老版本的浏览器可能不支持某些焦点事件。此外,焦点事件只会对具有焦点的元素生效,因此需要确保目标元素具有获取焦点的能力。

鼠标和滚轮事件- 16.4.8 -

在前端开发中,鼠标和滚轮事件是指用户通过鼠标或滚轮与页面交互时触发的事件。这些事件可以用来处理各种用户操作,例如点击、拖动、滚动等。

鼠标事件主要包括以下几种:

  • click事件:当用户点击一个元素时触发。

  • doubleclick事件:当用户双击一个元素时触发。

  • mousedown事件:当用户按下鼠标按钮时触发。

  • mouseup事件:当用户释放鼠标按钮时触发。

  • mousemove事件:当用户移动鼠标时触发。

  • mouseover事件:当用户将鼠标指针移动到元素上时触发。

  • mouseout事件:当用户将鼠标指针移出元素时触发。

滚轮事件主要是指wheel事件:当用户滚动鼠标滚轮时触发。该事件可以在任何元素上触发,最终会冒泡到document或window对象上。

在处理鼠标和滚轮事件时,需要注意以下几点:

  • 不同浏览器对于事件的兼容性不同,因此需要使用事件对象的特性来判断具体的事件类型和执行相应的操作。

  • 在处理滚轮事件时,可以使用event对象的wheelDelta属性来获取滚动的方向和速度,通常向前滚动为正数,向后滚动为负数。

  • 对于一些特定的事件类型,例如鼠标拖动,需要使用事件对象的clientX、clientY属性来确定鼠标的位置,并结合mousedown、mousemove和mouseup事件来处理拖动的开始、过程和结束。

  • 在处理鼠标和滚轮事件时,需要考虑用户体验和性能的因素,避免过多的事件处理程序对页面性能造成影响。

键盘与输入事件- 16.4.9 -

键盘事件是指用户在键盘上按下或释放按键时触发的事件,而输入事件是指在用户输入文本时触发的事件。

键盘事件主要包括以下几种:

  • keydown事件:当用户按下键盘上的某个键时触发。

  • keyup事件:当用户释放键盘上的某个键时触发。

  • keypress事件:当用户按下键盘上的某个键并产生字符时触发。

输入事件主要包括以下几种:

  • input事件:当用户在输入框中输入文本时触发。

  • change事件:当用户在输入框中输入文本并离开输入框时触发。

在使用键盘和输入事件时,需要注意以下几点:

  • 不同浏览器对于事件的兼容性不同,因此需要使用事件对象的特性来判断具体的事件类型和执行相应的操作。

  • 在处理键盘事件时,可以使用event对象的keyCode属性来获取按下的键的键码,或者使用charCode属性来获取字符编码。

  • 在处理输入事件时,可以使用event对象的data属性来获取用户输入的文本内容。

  • 对于一些特定的事件类型,例如文本输入,需要考虑用户体验和性能的因素,避免过多的事件处理程序对页面性能造成影响。

合成事件- 16.4.10 -

DOM3 Events新增了合成事件,这是一种特殊的事件,用于处理通常使用IME输入时的复杂输入序列。IME可以让用户输入物理键盘上没有的字符,例如,使用拉丁字母键盘的用户还可以使用IME输入日文。IME通常需要同时按下多个键才能输入一个字符。合成事件用于检测和控制这种输入。

以下是一个合成事件的示例,可以检测和记录用户通过IME输入的字符:

// 获取需要添加事件的元素  
let textbox = document.getElementById("myText");  
  
// 添加合成事件监听器  
textbox.addEventListener("compositionstart", function(event) {  
  console.log("开始输入合成事件:", event.data);  
});  
  
textbox.addEventListener("compositionupdate", function(event) {  
  console.log("更新输入合成事件:", event.data);  
});  
  
textbox.addEventListener("compositionend", function(event) {  
  console.log("结束输入合成事件:", event.data);  
});

在上面的示例中,首先获取了一个文本框元素,并使用addEventListener方法添加了三个合成事件的监听器。这些事件监听器分别在用户开始输入、更新输入和结束输入时触发,并打印出相应的消息和输入的字符。通过这些事件,可以对用户的输入行为进行监控和处理,例如,在用户输入特定字符时执行特定的操作。

触摸及手势事件- 16.4.11 -

触摸事件和手势事件是近年来随着触摸屏的普及而发展起来的两种新型事件。它们被广泛应用于移动设备上的应用程序开发,以实现各种与手指触摸和手势相关的人机交互功能。

触摸事件是指当用户的手指触摸屏幕时触发的事件,包括触摸开始、触摸移动和触摸结束三个阶段。在每个阶段,可以通过事件对象获取到不同的信息。例如,在触摸开始阶段,可以获取到触摸点的坐标、时间戳等信息;在触摸移动阶段,可以获取到触摸点的移动轨迹、速度等信息;在触摸结束阶段,可以获取到触摸点的坐标、时间戳等信息。

手势事件是指当用户在屏幕上进行手势操作时触发的事件,例如缩放、旋转、滑动等。这些手势操作可以由单个或多个手指完成,并产生一系列与手势相关的事件对象。例如,当用户进行缩放手势时,可以通过事件对象获取到缩放的比例、中心点坐标等信息;当用户进行旋转手势时,可以通过事件对象获取到旋转的角度、中心点坐标等信息。

在实现触摸和手势事件时,需要使用相关的API来捕获和处理这些事件。例如,在HTML5中,可以使用touchstart、touchmove、touchend等事件来捕获和处理触摸事件;使用gesturestart、gesturechange、gestureend等事件来捕获和处理手势事件。同时,还可以使用一些JavaScript库或框架来简化开发过程,例如jQuery Mobile、React Native等。