js Event对象的5种坐标

时间:2024-04-22 22:31:32 

但是你懂的,浏览器实在太不和谐了,兼容性且不说,各种坐标属性看得人头昏眼花,极容易混淆。好吧,我来总结一下:

测试浏览器:IE8, Chrome13, FF8, Safari5, Opera11
先上测试用例(用HTML5的doctype测试,也可看出未来的发展趋势,其他doctype可自行测试):


<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
<style type="text/css">
html {
background:red;
}
body {
background:green;
}
#null {
height:1000px;
}
#btn {
cursor:default;
background:blue;
width:50px;
height:30px;
line-height:30px;
text-align:center;
}
</style>
</head>
<body>
<div id='null'>空白区</div>
<div id="btn">点击</div><!-- 按钮用DIV是因为原生按钮有圆角,不确定边界 -->
</body>
<script type="text/javascript">
window.onload = function(){
var btn = document.getElementById('btn');
btn.onclick = function(e){
e = e|| window.event;
var box = (e.target || e.srcElement).getBoundingClientRect(),
offsetX = e.clientX - box.left,
offsetY = e.clientY - box.top;
p('x: '+ e.x+', y: '+e.y);
p('pageX: '+ e.pageX+', pageY: '+e.pageY);
p('offsetX: '+ e.offsetX+', offsetY: '+e.offsetY);
p('FF实现 offsetX: '+offsetX+', offsetY: '+offsetY);
p('layerX: '+ e.layerX+', layerY: '+e.layerY);
p('clientX: '+ e.clientX+', clientY: '+e.clientY);
p('body.scrollLeft: '+ document.body.scrollLeft+', body.scrollTop: '+document.body.scrollTop);
p('body.clientLeft: ' + document.body.clientLeft + ', body.clientTop: '+document.body.clientTop);
p('documentElement.scrollLeft: '+ document.documentElement.scrollLeft+', documentElement.scrollTop: '+document.documentElement.scrollTop);
p('documentElement.clientLeft: ' + document.documentElement.clientLeft + ', documentElement.clientTop: '+document.documentElement.clientTop);
}
}
function p(s){
console.log(s);
}
</script>
</html>


问:怎样获取鼠标相对于浏览器可视文档区域左上角的位置?
答:x, y和clientX, clientY皆可,但是x, y在IE下表示鼠标相对于文档开头的位置(即如果有滚到条的话,会计算在内),还有FF也不支持x, y
推荐: clientX, clientY

问:怎样获取鼠标相对于文档开头的位置?
答: IE:使用x, y(前提是事件源的父元素(一直到documentElement)没有设置position:relative之类的,否则相对于最近元素,而非相对于文档)
非IE:使用pageX, pageY
layerX, layerY其实也可以,但是IE和Opera不支持!
那么如何确保IE正常取值呢?答:event.clientX + document.documentElement.scrollLeft,event.clientY + document.documentElement.scrollTop

问:怎样获取鼠标相对于事件源(event.target||event.srcElement)左上角的位置?
答:offsetX, offsetY。但是FF不支持,怎样办呢?
1. 先获取鼠标相对于浏览器可视文档区域左上角的位置
2. 然后获取事件源相对于浏览器可视文档区域左上角的位置
3. 相减,收工
也许有人会问,这第2步怎么做啊?好吧,好人做到底!
HTMLElement.getBoundingClientRect()方法
返回值为:{top:xx, right:xx, bottom:xx, left:xx, width:xx, height:xx}
也就是说,一个元素的位置信息都给了,我们要做的就是:


var box = (e.target || e.srcElement).getBoundingClientRect(),
offsetX = e.clientX - box.left,
offsetY = e.clientY - box.top;


经测试,所有浏览器都和event.offsetX, event.offsetY保持一致(当然FF除外)

我的例子中,最后还检测了scrollLeft, scrollTop, clientLeft, clientTop,本来以为它们几个会作怪,可测试结果表明:
除了scrollTop,其他都是0(当然scrollLeft是因为没出现横向滚动条所致)
scrollTop各浏览器表现不尽相同,如下:
body.scrollTop的情况
IE, FF, Opera:0
Chrome, Safari:向上滚动的距离
documentElement.scrollTop的情况
IE, FF, Opera:向上滚动的距离
Chrome, Safari:0

标签:坐标
0
投稿

猜你喜欢

  • 使用SQL2000将现有代码作为Web服务提供

    2009-02-19 17:20:00
  • Python+Opencv实战之人脸追踪详解

    2022-09-22 16:03:38
  • 通过MySQL内置全文检索实现中文的相关检索

    2010-06-11 13:20:00
  • Python模块、包(Package)概念与用法分析

    2022-09-02 13:06:22
  • pandas删除指定行详解

    2021-09-21 10:08:37
  • python模拟登录百度贴吧(百度贴吧登录)实例

    2023-11-20 14:30:56
  • Python基于smtplib实现异步发送邮件服务

    2021-01-15 07:40:37
  • window.onload使用指南

    2024-04-18 10:58:51
  • 详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击

    2023-03-16 14:33:51
  • Extjs显示从数据库取出时间转换JSON后的出现问题

    2024-01-18 12:52:13
  • 什么是XSLT,什么是XPath

    2008-01-21 13:12:00
  • Centos7系统下Mysql主从同步配置方案

    2024-01-24 11:29:18
  • Burpsuite入门及使用详细教程

    2023-08-15 19:07:07
  • Python插入Elasticsearch操作方法解析

    2021-08-30 01:47:09
  • 一文带你了解Go语言标准库math和rand的常用函数

    2024-02-22 07:24:24
  • python实现简单神经网络算法

    2021-03-22 07:03:16
  • python实现移位加密和解密

    2022-03-20 09:09:27
  • laravel清除视图缓存的代码

    2023-11-24 14:39:39
  • Python list sort方法的具体使用

    2023-01-14 22:27:46
  • jupyter notebook运行命令显示[*](解决办法)

    2022-02-19 01:23:10
  • asp之家 网络编程 m.aspxhome.com