javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > JS鼠标事件

JavaScript鼠标事件逐一分析(附代码)

作者:长城2024

鼠标事件是Web交互的基石,从最简单的按钮点击到复杂的拖拽绘图、游戏控制,都离不开对鼠标事件的监听和处理,这篇文章主要介绍了JavaScript鼠标事件逐一分析的相关资料,需要的朋友可以参考下

前言

JavaScript鼠标事件是指当用户使用鼠标与网页进行交互时,浏览器自动触发的一系列信号。这些信号会以事件对象的形式传递给JavaScript代码,让开发者能够捕捉并响应用户的操作,从而实现各种交互效果。

简单来说,鼠标事件就是用户鼠标动作与网页之间的沟通语言。当用户点击、移动、滚动或悬停时,浏览器会发出相应的通知,而开发者编写的代码则可以监听这些通知并做出反应。

常见的鼠标事件包括:

每个鼠标事件都会携带丰富的事件对象,包含鼠标位置、按下的按键、是否同时按下了功能键(如Ctrl、Shift)等信息。这使得开发者可以精确地控制交互行为,例如判断用户点击的是左键还是右键、鼠标在页面中的具体坐标、是否按住Shift键进行多选等。

鼠标事件是Web交互的基石,从最简单的按钮点击到复杂的拖拽绘图、游戏控制,都离不开对鼠标事件的监听和处理。

一、JavaScript鼠标事件逐一分析

(一)核心鼠标事件(基础交互)

1.click

2.dblclick

3.mousedown

4.mouseup

5.mousemove

6.mouseover

7.mouseout

8.mouseenter

9.mouseleave

(二)滚轮与上下文菜单事件

10.wheel

11.contextmenu

二、总结列表

以下是JavaScript中11个常用鼠标事件的总结列表。

事件含义词源语法参数及说明
1click当用户在元素上按下并释放鼠标主键(通常是左键)时触发。"click"意为"点击",模拟鼠标点击的声音。element.addEventListener('click', function(event) {...});
element.onclick = function(event) {...};
回调函数接收 MouseEvent 对象。依赖于 mousedown 和 mouseup 的先后触发,如果其中任何一个被取消,click 就不会触发。
2dblclick当用户在元素上双击鼠标主键时触发。"dbl"是"double"(双倍)的缩写,"click"意为点击。element.addEventListener('dblclick', function(event) {...});
element.ondblclick = function(event) {...};
回调函数接收 MouseEvent 对象。依赖于两次连续的 click 事件,如果任意一次 click 被取消,dblclick 也不会触发。
3mousedown当用户在元素上按下任意鼠标按钮时立即触发,无需释放按钮。"mouse"(鼠标)+ "down"(按下)。element.addEventListener('mousedown', function(event) {...});
element.onmousedown = function(event) {...};
回调函数接收 MouseEvent 对象。可通过 event.button 判断按下的键(0:左键,1:中键,2:右键)。不能通过键盘触发。
4mouseup当用户释放按下的鼠标按钮时触发。"mouse" + "up"(抬起)。element.addEventListener('mouseup', function(event) {...});
element.onmouseup = function(event) {...};
回调函数接收 MouseEvent 对象。与 mousedown 配对使用,常用来检测完整的点击操作。不能通过键盘触发。
5mousemove当鼠标在元素内部移动时持续触发。"mouse" + "move"(移动)。element.addEventListener('mousemove', function(event) {...});
element.onmousemove = function(event) {...};
回调函数接收 MouseEvent 对象。该事件会高频触发,监听函数中应避免执行耗时操作,以免影响性能。
6mouseover当鼠标指针从元素外部移动到元素边界内时触发。移动到子元素上也会再次触发。"mouse" + "over"(在...上方)。element.addEventListener('mouseover', function(event) {...});
element.onmouseover = function(event) {...};
回调函数接收 MouseEvent 对象。可通过 event.relatedTarget 获取鼠标来自哪个元素。会冒泡,进入子元素时会重复触发。
7mouseout当鼠标指针离开元素边界时触发。移动到子元素上也会触发。"mouse" + "out"(离开)。element.addEventListener('mouseout', function(event) {...});
element.onmouseout = function(event) {...};
回调函数接收 MouseEvent 对象。可通过 event.relatedTarget 获取鼠标将要去往的元素。会冒泡,移动到子元素时也会触发。
8mouseenter当鼠标首次进入元素边界时触发。移动到子元素时不会重复触发。"mouse" + "enter"(进入)。element.addEventListener('mouseenter', function(event) {...});
element.onmouseenter = function(event) {...};
回调函数接收 MouseEvent 对象。DOM3级事件,不会冒泡,移动到子元素时不会重复触发,行为更直观。
9mouseleave当鼠标完全离开元素边界时触发。离开到子元素时不会触发。"mouse" + "leave"(离开)。element.addEventListener('mouseleave', function(event) {...});
element.onmouseleave = function(event) {...};
回调函数接收 MouseEvent 对象。DOM3级事件,不会冒泡,与 mouseenter 配对使用,行为更符合直觉。
10wheel当用户滚动鼠标滚轮或操作类似滚轮的输入设备时触发。"wheel"意为"滚轮"。element.addEventListener('wheel', function(event) {...});
element.onwheel = function(event) {...};
回调函数接收 WheelEvent 对象(继承自 MouseEvent)。可通过 deltaYdeltaX 获取滚动量。
11contextmenu当用户尝试打开上下文菜单时触发(通常是点击鼠标右键)。"context"(上下文)+ "menu"(菜单)。element.addEventListener('contextmenu', function(event) {...});
element.oncontextmenu = function(event) {...};
回调函数接收 MouseEvent 对象。调用 event.preventDefault() 可以阻止浏览器默认的右键菜单显示,用于自定义菜单。

三、鼠标事件对象的常用属性

所有鼠标事件都接收一个 MouseEvent 对象,它包含以下常用属性:

属性含义说明
clientX / clientY鼠标指针相对于浏览器视口(viewport)的坐标不考虑页面滚动
pageX / pageY鼠标指针相对于整个文档的坐标考虑页面滚动
screenX / screenY鼠标指针相对于屏幕的坐标以整个显示器屏幕为参照
offsetX / offsetY鼠标指针相对于目标元素内边距边缘的坐标以事件绑定的元素为参照
button触发事件的鼠标按钮0:左键, 1:中键, 2:右键
buttons事件触发时按下的所有按钮位掩码表示多个按钮同时按下
altKey / ctrlKey / shiftKey / metaKey布尔值,表示事件触发时对应的功能键是否被按下用于检测组合操作
relatedTarget与事件相关的次要目标主要用于 mouseover/mouseout 等事件
detail事件细节信息对于点击事件,表示点击次数

四、鼠标事件的注意事项

  1. 事件冒泡与捕获:除 mouseenter 和 mouseleave 外,大多数鼠标事件都支持冒泡。这意味着事件会从目标元素向上传播到父元素。

  2. 事件依赖关系click 事件依赖于 mousedown 和 mouseup 的完整触发,dblclick 依赖于两次连续的 click 事件。

  3. 性能考虑mousemove 事件会高频触发,监听函数中应避免执行复杂的计算或DOM操作。

  4. 浏览器兼容性mouseenter 和 mouseleave 是DOM3级事件,现代浏览器都支持,但在非常旧的浏览器中可能需要回退方案。

  5. 右键菜单阻止:使用 contextmenu 事件并调用 preventDefault() 可以自定义右键菜单,但某些浏览器可能允许用户通过浏览器设置强制显示默认菜单。

五、综合示例

以下示例演示了如何在同一个元素上监听多个鼠标事件,并对每个事件做出响应:

<div id="demo" style="width:300px;height:300px;background:#f0f0f0;padding:20px;border:2px solid #ccc;">
  <h3>鼠标交互区域</h3>
  <p>尝试不同的鼠标操作:点击、双击、右键、进入/离开、移动</p>
  <div id="nested" style="width:200px;height:100px;background:#d0d0d0;margin-top:10px;padding:10px;">
    嵌套子元素
  </div>
</div>
<div id="log" style="margin-top:20px;padding:10px;background:#e0e0e0;height:150px;overflow:auto;"></div>

<script>
const demo = document.getElementById('demo');
const nested = document.getElementById('nested');
const log = document.getElementById('log');

function logEvent(eventName, e) {
  const time = new Date().toLocaleTimeString();
  const message = `[${time}] ${eventName} - 目标: ${e.target.tagName}, 位置: (${e.clientX}, ${e.clientY})`;
  
  const entry = document.createElement('div');
  entry.textContent = message;
  log.appendChild(entry);
  log.scrollTop = log.scrollHeight; // 自动滚动到底部
}

// 基础点击事件
demo.addEventListener('click', (e) => logEvent('click', e));
demo.addEventListener('dblclick', (e) => logEvent('dblclick', e));
demo.addEventListener('mousedown', (e) => logEvent('mousedown', e));
demo.addEventListener('mouseup', (e) => logEvent('mouseup', e));

// 移动事件(添加节流)
let lastMove = 0;
demo.addEventListener('mousemove', (e) => {
  const now = Date.now();
  if (now - lastMove > 100) { // 限制每秒最多10次
    lastMove = now;
    logEvent('mousemove (节流)', e);
  }
});

// 进入/离开事件 - 对比mouseover/mouseout与mouseenter/mouseleave
demo.addEventListener('mouseover', (e) => logEvent('mouseover', e));
demo.addEventListener('mouseout', (e) => logEvent('mouseout', e));
demo.addEventListener('mouseenter', (e) => logEvent('mouseenter', e));
demo.addEventListener('mouseleave', (e) => logEvent('mouseleave', e));

// 右键菜单
demo.addEventListener('contextmenu', (e) => {
  e.preventDefault();
  logEvent('contextmenu (自定义)', e);
});

// 滚轮事件
demo.addEventListener('wheel', (e) => {
  logEvent('wheel - deltaY: ' + e.deltaY, e);
  // 不阻止默认行为,保持页面可滚动
});

// 演示relatedTarget
demo.addEventListener('mouseover', (e) => {
  if (e.relatedTarget) {
    console.log('mouseover - 来自:', e.relatedTarget.tagName);
  }
});

demo.addEventListener('mouseout', (e) => {
  if (e.relatedTarget) {
    console.log('mouseout - 前往:', e.relatedTarget.tagName);
  }
});
</script>

综合示例分析

这个综合示例创建了一个完整的鼠标事件演示环境。通过日志面板,可以直观地看到:

通过运行这个示例并观察日志输出,可以更深入地理解每个鼠标事件的特性和适用场景。

总结

到此这篇关于JavaScript鼠标事件的文章就介绍到这了,更多相关JS鼠标事件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文