document.elementFromPoint

先说一下这个方法的参数

elemntFromPoint(x,y);//传入坐标值,返回当前页面上包含该坐标点的顶层元素

注意2点,坐标值和顶层元素

先说坐标,因为不同的人理解是不一样的,也就造就了这个方法在不同的浏览器中表现是不一样的,所以在传入坐标时就分 整体页面坐标 和 可视区域坐标,我们看上篇文章中的图来理解下:
pic
中间的方块是可视区域,红点相对可视区域的左上角我们称之为 clientX和clientY,相对于页面起始处的左上角称之为 pageX和pageY

有的浏览器在调用elementFromPoint时要求传入clientX和clientY而有的要求pageX和pageY,具体的详见:http://www.quirksmode.org/webkit.html 看 elementFromPoint部分,上面也提到如果在标准中进行规则统一,也会规定使用可视区域的坐标

显然我们如果要用这个方法时,就要注意兼容了,而对于同一种浏览器,因为版本的不同,导致同样的这个方法可能要求传入的坐标也不同,比如chrome浏览器,那么,我们该如何去兼容呢?

The w3c specification says:

The elementFromPoint(x, y) method, when invoked, must return the element at coordinates x,y in the viewport. The element to be returned is determined through hit testing. If either argument is negative, x is greater than the viewport width excluding the size of a rendered scroll bar (if any), or y is greater than the viewport height excluding the size of a rendered scroll bar (if any), the method must return null. If there is no element at the given position the method must return the root element, if any, or null otherwise.

调用elementFromPoint时,必须传入可视区域内的坐标,如果你传入的坐标不在可视区域内,即使在这个坐标处有元素,也将返回null;我们可以根据这个特性来写兼容代码:

使用jq实现的代码如下,我们可以很方便的改写成自已的

(function($) {var check = false,isRelative = true;$.elementFromPoint = function(x, y) {if (!document.elementFromPoint) return null;if (!check) {var sl;if ((sl = $(document).scrollTop()) > 0) {isRelative = (document.elementFromPoint(0, sl + $(window).height() - 1) == null);} else if ((sl = $(document).scrollLeft()) > 0) {isRelative = (document.elementFromPoint(sl + $(window).width() - 1, 0) == null);}check = (sl > 0);}if (!isRelative) {x += $(document).scrollLeft();y += $(document).scrollTop();}return document.elementFromPoint(x, y);}
})(jQuery);

原理就是上面说的,如果页面有滚动,则尝试获取页面坐标最边缘处的元素,如果能获取到,说明是使用页面坐标,因为在有滚动的情况下,获取可视边缘处的坐标,页面坐标会大于可视区域的坐标,所以如果是用可视区域坐标,肯定返回null

嗯,一切看起来都还不错,IE6 7就不行了,仔细看了下这个方法,这个方法最早应该是IE特有的,最后被其它浏览器实现,在IE下,一直使用的是可视区域的坐标,但是在IE6 7的情况下,当你传大于可视区域的坐标时,也是可以获取到值的,也就造成了上面兼容代码无法在IE6 7下正常工作,所以上面的代码并没有考虑IE6 7的情况,需要你添加一些判断。

除了坐标问题外,该方法只能返回顶层元素,也就是在有2个元素重叠的情况下,只能返回最上层的元素。

之前我也有写过高效拖动的文章,比如拖动排序分类,常见的是鼠标在拖动的时候,不停的计算鼠标是在哪个分类上面,然后做出变换的效果,如果列表元素比较少的情况下还是可以的,如果大于1000个,而这些分类的高度不定,通过这个循环判断的方法显示就会觉得很卡

我在之前的文章中提到可以在mousemove时,不让任何元素挡着鼠标(通常我们可能会在拖动时,让被拖动的元素随鼠标一起移动,这时候元素可能挡在鼠标的下方),可通过事件的event.target获取鼠标指向的元素,这样列表中有多少个元素都不会影响到效果

回头说一下setCapture方法,该方法是IE下让元素捕获到事件,比如鼠标移到浏览器外边也可以响应得到,然而这个方法在firefox在4版本时被引进firefox中,引入后如果拖动时你调用了setCapture,就算鼠标下面没有东西挡着,event.target也始终是鼠标按下时的target,IE中则不是,调用setCapture后,mousemove时依然可以获取到,当然IE下可能要用event.srcElement获取

所以,保险起见,我们要调用setCapture,而调用后,firefox4以后又不能及时获取到鼠标下的元素,抛开这些,在ios设备上,touchmouse时,同样也是获取不到手指指向的元素,所以只好回头折腾这个elementFromPoint了。

在折腾这些的时候,还发现诸如getBoundingClientRect在ios设备上也是有问题的,这个方法正常返回相对可视区域的坐标,而在ios上,实现的却是相对页面的坐标,实在让人郁闷

回头再看一下兼容,之前做浏览器间的兼容,更多的是这个浏览器有这个方法,那个浏览器有那个方法,方法的不同而已,现在的兼容则是同样的方法,最终的结果不同,比如setCapture还有getBoundingClientRect等,可能还有其它一些有问题的方法,这种兼容起来更麻烦,远不如没有方法来的干脆些。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iis6 开启options方法_《王者荣耀》暗夜危机什么时候开启 暗夜危机开启时间

导读 王者荣耀神秘关卡暗夜危机怎么进?许多玩家对于这个暗夜危机的关卡还不太熟悉,不知道如何开启,下面就让九游小编为大家带来,王者荣耀暗夜危机开启方法介绍。 王者荣耀神秘关卡暗夜危机怎么进? 峡谷异闻... 王者荣耀…

全球顶级大学,在中国录取率却不足0.5%,答案一针见血!

▲点击查看一提起新加坡教育,恐怕大家的第一反应都是:特别牛!到底有多牛呢?我们拿数据说话——在全球公认的学生能力测试中,新加坡数学屡屡夺魁!在“国际数学和科学评测趋势报告 2019”(TIMSS&a…

div+css+js 树形菜单

2019独角兽企业重金招聘Python工程师标准>>> 代码&#xff1a; <div class"main_2"> <div class"m_left"> <ul class"nav"> <li id"bottom_none"><a href"#" onClick"DoMenu(C…

马化腾最崇拜的作家吴晓波《历代经济变革得失》读书笔记

吴晓波先生&#xff0c;是马化腾最崇拜的作家&#xff0c;腾讯的朋友说&#xff0c;马化腾逢人便推荐吴晓波的写的书《历代经济变革得失》&#xff0c;并亲自指示腾讯视频免费推广这个视频讲座。这本书我通读了两遍&#xff0c;总结了如下的笔记&#xff1a;

SQL:认识数据库约束

讲了关于数据库的很多内容&#xff0c;也讲了很多约束&#xff0c;对唯一和主键、核查和规则、外键约束很感兴趣。 一、唯一和主键&#xff08;实体完整性&#xff09;区别&#xff1a;数量&#xff1a;一张表只可以有一个主键约束&#xff0c;却可以有多个唯一约束。是否空值&…

Android之使用IDA Pro静态分析so文件

安卓应用程序的开发语言是java&#xff0c;但是由于java层的代码很容易被反编译&#xff0c;而反编译c/c程序的难度比较大&#xff0c;所以现在很多安卓应用程序的核心部分都使用NDK进行开发。关于NDK的开发知识点&#xff0c;请看这篇博客&#xff1a;Android之NDK开发。 关于…

.NET 6 中的 Logging Source Generator

.NET 6 中的 Logging Source GeneratorIntroLogging source generator 是 .NET 6 引入的一个新功能&#xff0c;借助 Source Generator 来实现&#xff0c;因为要用到 C# 9 中的分部方法(partial method)&#xff0c;C# 语言需要使用 9 及以上版本&#xff0c;具有更好的性能以…

电脑内部录音教程Virtual Audio Cable使用教程

1:下载Virtual Audio Cable2&#xff1a;安装Virtual Audio Cable3&#xff1a;设置&#xff08;注意这里line1不要开启监听其他设备&#xff09;3&#xff1a;打开声音传输通道软件C:\Program Files\Virtual Audio Cable\audiorepeater.exe点击start启动&#xff0c;最小化。4…

战队口号霸气押韵8字_高考励志班级口号霸气押韵大全

【导语】高考没有什么可怕的&#xff0c;一定要保证心态好&#xff0c;就可能考出比平时更好的成绩。下面是无忧考网分享的高考励志班级口号霸气押韵大全。欢迎阅读参考&#xff01;【篇一】高考励志班级口号霸气押韵1.激情澎湃&#xff0c;高考不败&#xff0c;斗志昂扬&#…

别说理科男不懂撩妹,这个老司机一生只爱两样:物理和18岁的少女

全世界只有3.14 % 的人关注了爆炸吧知识相信在很多人的眼中&#xff0c;科研人员都是正经和严肃的代名词。成就大&#xff0c;光芒大&#xff0c;仿佛天生圣人。但是超模君在和大家讲了这么多科学家的故事后&#xff0c;发现还是那句俗话说得好&#xff1a;科研是科研&#xff…

一条nginx命令引发的对于容器的思考

去年的时候写了一篇原创《前后端分离&#xff0c;如何在前端项目中动态插入后端API基地址&#xff1f;&#xff08;in docker&#xff09;》&#xff0c; 我自认为这篇生产实践是对大前端、 容器化、CI/CD的得意之作。对于前后端分离的web项目&#xff0c;在容器启动的瞬间&…

部门树形结构,使用Treeview控件显示部门

部门树形结构。设计张部门表用于存储部门编码、名称、上级部门id&#xff0c;使用Treeview控件显示部门树&#xff0c;并实现部门增删改、移动、折叠等功能。特别提示&#xff0c;部门有层级关系&#xff0c;可用donetbar的adtree控件 代码如下 1 using System;2 using System.…

移动端 登陆 模板 html_聚会邀请函请柬模板 免费设计制作生成

制作邀请函 请关注我们聚会并非你的个人发布会和生活成果展&#xff0c;而在于描绘经历了风雨沧桑的那道彩虹&#xff0c;世事变化&#xff0c;聚会不是为了显示某人身居高位&#xff0c;也不是衣锦还乡或日过斗金、大富大贵的炫耀&#xff0c;重温那充满梦想的花样年华&#x…

他们是你学生时期的噩梦,但现在你可以把他们按在墙上摩擦了……

全世界只有3.14 % 的人关注了爆炸吧知识用艺术家的眼光去看科学&#xff0c;用人生的角度去看艺术。——尼采看过日剧的朋友都不会陌生下面的场景&#xff1a;日本主妇会将存放在冰箱中的东西列出清单&#xff0c;然后用磁贴将之贴在冰箱门上。每次购物或煮食后&#xff0c;她们…

推荐系统相关算法(1):SVD

假如要预测Zero君对一部电影M的评分&#xff0c;而手上只有Zero君对若干部电影的评分和风炎君对若干部电影的评分&#xff08;包含M的评分&#xff09;。那么能预测出Zero君对M的评分吗&#xff1f;答案显然是能。最简单的方法就是直接将预测分定为平均分。不过这时的准确度就难…

vSphere日志分析器(vCenter Log Insight)安装、配置

很久没更新博客&#xff0c;最近在网上看到了1.0版本的vSphere分析器可下载并可测试&#xff0c;测试完后发觉以前人肉全手动分析log&#xff0c;看得眼前飘白雪的情况不会出现了。这里和大家分享一下。1 关于vCenter Log Insight当ESX/ESXi主机发生故障&#xff0c;很多用户或…

android开发将h5转换成pdf_一键将PDF转换成PPT,秒懂!

PDF因能良好的兼容各操作系统和软件版本的差异性&#xff0c;使得PDF文档在查阅播放的时候不影响排版变化&#xff0c;很多时候&#xff0c;我们因为工作上的需要&#xff0c;经常需要再次将PDF转换成PPT&#xff0c;那么怎样将PDF转换成PPT呢&#xff1f;需要下载专业的转换工…

MongoDB 权限认证

MongoDB已经使用很长一段时间了&#xff0c;基于MongoDB的数据存储也一直没有使用到权限访问&#xff08;MongoDB默认设置为无权限访问限制&#xff09;&#xff0c;因为考虑到数据安全的原因特地花了一点时间研究了一下&#xff0c;网上搜出来的解决方法大都是3.0以下的版本的…