关于JS DOM中侦听事件获取的各种坐标简单梳理

本文梳理了DOM中鼠标点击事件监听获取的各种坐标属性,包括e.x/e.y(相对于视口)、e.pageX/e.pageY(相对于文档)、e.screenX/e.screenY(相对于屏幕)以及e.offsetX/e.offsetY(相对于事件源元素)。通过对不同坐标属性的举例说明,帮助理解它们在不同场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单梳理一下DOM中的各种宽、高。首先我们给全局DOM加一个鼠标点击监听事件,用于监听我们要观察的宽高,代码如下:

window.addEventListener("mousedown",demo);
    function demo(e){
        e=e || window.event;
        console.log("我们观察的宽高值");
    }

1.e.x , e.y

获取的是相对于屏幕可见区域的坐标,如果存在滚动条,那么隐藏的那部分是被忽略的,也就是说如果网页很长,出现了滚动条时,鼠标放在如图位置点击鼠标,随后鼠标不动,滚动滚轮,再次点击,两次都是(0,0)。等同于div.clientX 与 div.clientY 这样获取。

2.e.pageX , e.pageY(IE不支持)

获取的是相对于文档的坐标,左上角为(0,0),左、上为负右、下为正。如果网页很长,出现了滚动条,我们进行如下操作:

 

  1. 鼠标放在图示位置点击一次,输出(0,0)。
  2. 保持鼠标不动,滚动鼠标滚轮,鼠标再次点击,输出(0,167)。

所以可见pageX 和 pageY获取的是相对文档高度,可以理解为距body最左上角的位值。

3.e.screenX , e.screenY

<think>好的,用户想了解如何使用JavaScript在DOM上监听鼠标单击事件。首先,我需要整理几种常见的方法,确保覆盖不同的场景和兼容性。 首先想到的是标准的addEventListener方法,这是现代浏览器推荐的方式。需要解释它的基本用法,包括参数:事件类型、回调函数、是否捕获阶段。举个例子,比如点击div时改变背景颜色。这时候可以引用引用[2]和[3],说明addEventListener的优势,比如支持多个处理函数。 然后,考虑到旧版IE浏览器,用户可能还需要知道attachEvent方法。这时候需要提到IE特有的用法,比如事件名前加"on",以及如何移除事件。引用[1]提到了attachEvent和detachEvent,可以用来做对比,说明兼容性处理的重要性。 还有传统的方式,比如直接赋值onclick属性。这种方法简单,但只能绑定一个处理函数,引用[4]中的例子正好说明了这一点。需要指出这种方法的局限性,比如覆盖之前的事件处理程序。 接下来,应该比较这三种方法的优缺点。比如addEventListener的灵活性和兼容性更好,而attachEvent已逐渐被淘汰。传统方式适合简单需求,但扩展性差。 最后,生成相关问题时要覆盖事件移除、兼容性处理、其他事件类型,以及事件冒泡和捕获的区别。这些问题能帮助用户深入理解事件处理机制。 在回答过程中,需要确保代码示例正确,用中文注释,同时引用对应的参考文献。比如在addEventListener的例子后引用[2][3],在IE部分引用[1],传统方法引用[4]。同时,注意LaTeX格式的正确使用,但这个问题可能较少涉及数学公式,所以重点放在代码块和引用上。 总结步骤:介绍三种方法,分别给出示例代码,比较优缺点,最后生成相关问题。确保结构清晰,用户能逐步理解如何实现鼠标点击事件的监听。</think>### JavaScript监听DOM鼠标单击事件的实现方法 #### 1. **标准方法:`addEventListener`** 现代浏览器推荐使用`addEventListener`方法,支持同时绑定多个事件处理程序: ```javascript // 获取DOM元素 const button = document.getElementById('myButton'); // 定义事件处理函数 function handleClick(event) { console.log('坐标:', event.clientX, event.clientY); alert('按钮被点击!'); } // 绑定点击事件(第三个参数默认为false表示冒泡阶段) button.addEventListener('click', handleClick); // 支持添加多个处理程序 button.addEventListener('click', () => { console.log('第二个处理程序'); }); // 移除事件监听 // button.removeEventListener('click', handleClick); ``` *优势*:支持事件捕获/冒泡控制、多处理程序绑定[^2][^3] #### 2. **兼容旧版IE的方法:`attachEvent`** 针对IE8及以下版本的兼容方案: ```javascript var div = document.getElementById('oldIEdiv'); // 事件名称需要加"on"前缀 div.attachEvent('onclick', function() { alert('IE特殊处理'); }); // 移除事件 // div.detachEvent('onclick', handler); ``` *注意*:处理函数中的`this`指向window对象而非目标元素[^1] #### 3. **传统属性绑定** 适用于简单场景的快捷方式: ```javascript const image = document.querySelector('img'); // 直接赋值事件属性(会覆盖已有处理程序) image.onclick = function(e) { this.style.border = '2px solid red'; }; // 添加第二个处理程序会覆盖前一个 image.onclick = function() { console.log('只保留最后这个处理程序'); }; ``` *局限性*:单处理程序绑定、无法控制事件阶段[^4] #### 方法对比表 | 特性 | addEventListener | attachEvent | onclick属性 | |----------------------|------------------|-------------|-------------| | 多处理程序支持 | ✅ | ✅ | ❌ | | 事件阶段控制 | ✅ | ❌ | ❌ | | IE兼容性 | IE9+ | IE5-10 | 全支持 | | 移除方式 | removeEventListener | detachEvent | 赋值为null | ### 最佳实践建议 1. 优先使用`addEventListener`,因其功能最完善 2. 需要兼容旧IE时,使用特性检测: ```javascript if (element.addEventListener) { element.addEventListener('click', handler); } else if (element.attachEvent) { element.attachEvent('onclick', handler); } else { element.onclick = handler; } ``` 3. 事件委托优化性能(适合动态元素): ```javascript document.getElementById('list').addEventListener('click', function(e) { if(e.target.tagName === 'LI') { console.log('点击列表项:', e.target.textContent); } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值