`
指甲刀X
  • 浏览: 33925 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

解决FireFox的鼠标Event中没有offsetX,offsetY的办法

阅读更多

之前制作了一个html版的连连看,最近改成html5版的,遇到了如何获取当前点击图片的问题。

因为之前的连连看用的图片是一个个零碎的图片,放入一个固定大小的div中,然后设置图片统一向左浮动。通过js事件委托,当点击图片的时候,查找当前event的target,就能得到点击的图片。

但是改成html5之后,所有的图片都被画在一个canvas里,鼠标点击的时候只能获取到整个canvas Element,所以得另寻思路。

 

 

我想到的办法是把点击事件绑定在canvas上,然后通过鼠标相对canvas的偏移offsetX/Y除以图片的width/height向下取整,这样就能将canvas里图片转换成一个2维数组,与我的map数组对应起来,从而解决获取图片的问题。

如何您有更好的办法,还请赐教。

 

可是FF的event中没有offsetX/Y,而是提供了一个layerX/Y。

那我们就来研究下这个layerX/Y是什么,与offsetX/Y有什么不同。


我们知道在各大主流浏览器的鼠标点击事件中,有clientX/Y、offsetX/Y(FF除外)、screenX/Y、pageX/Y(ie系列除外)等属性。

其中:

clientX/Y是鼠标相对与浏览器视口的偏移;

offsetX/Y是鼠标相对于绑定点击事件的element的偏移;

screenX/Y是鼠标相对于整个屏幕的偏移;

pageX/Y是鼠标相对于documentElement/body的偏移;

 

 

而layerX/Y只有FF提供,是鼠标相对于事件绑定element的最近的设置了position属性 的element。

在我的例子中,canvas element的最近的设置了position属性的element是外层的wrap,所以offsetX/Y的值是从外层wrap的左上角开始计算的。

搞清楚这一点,我们只需要给canvas 加一个position为relative的样式即可让layerX/Y等价于offsetX/Y,从而解决FF下没有offsetX/Y的问题!

 

总结一下,解决FF下offsetX/Y的办法就是给绑定事件的element设置一个postion为relative的样式,然后通过layerX/Y来取值。

分享到:
评论

相关推荐

    Javascript下IE与Firefox下的差异兼容写法总结

    window.event对象差异 IE:有window.event对象 FF:没有window.event对象。... 鼠标当前坐标(加上滚动条滚过的距离) IE:event.offsetX和event.offsetY。 FF:event.layerX和event.layerY。 标签的x和y的坐标位置:styl

    整理的比较全的event对像在ie与firefox浏览器中的区别

    window.event IE:有window.event对象 FF:没有window.event对象。... 鼠标当前坐标(加上滚动条滚过的距离) IE:event.offsetX和event.offsetY。 FF:event.layerX和event.layerY。 标签的x和y的坐标位置:style.posL

    event.x,event.clientX,event.offsetX区别

    offsetx:设置或者是得到鼠标相对于目标事件的父元素的内边界在x坐标上的位置。 screenX:相对于用户屏幕。测试代码一:[code] <html> <head> </head> [removed] function reload(){ [removed]....

    IE与FireFox的兼容性问题分析

    window.event IE:有window.event对象 FF:没有window.event对象。... 鼠标当前坐标(加上滚动条滚过的距离) IE:event.offsetX和event.offsetY。 FF:event.layerX和event.layerY。 标签的x和y的坐标位置:sty

    Event对象详解

    altKey, button, cancelBubble, clientX, clientY, ctrlKey, fromElement, keyCode, offsetX, offsetY, propertyName, returnValue, screenX, screenY, shiftKey, srcElement, srcFilter, toElement, type, x, y

    JavaScript中获取鼠标位置相关属性总结

    javascript并没有mouse对象,获取鼠标坐标要靠强大的event对象。 我们通过监听document的mousemove,就可以实时获得鼠标位置。 但是!!event中和鼠标相关的属性太多了,很让人头大!如下: event.layerX event....

    IE和FF在对js支持的不同(整理)及解决方法

    1.window.event IE:有window.event对象 FF:没有window.event对象,可以通过函数的参数传递event对象。如onclick=clickHandler(event)...3. 鼠标坐标加上滚动条滚过的距离 IE:event.offsetX和event.offsetY FF:event

    比较全面的event对像在IE与FF中的区别 推荐

    window.event IE:有window.event对象 FF:没有window.event对象。... 鼠标当前坐标(加上滚动条滚过的距离) IE:event.offsetX和event.offsetY。 FF:event.layerX和event.layerY。 标签的x和y的坐标位置:style.posL

    JavaScript取得鼠标绝对位置程序代码介绍

    首先不同浏览器中event位置属性的... IE的event.offsetX,event.offsetY和Firefox的event.layerX,event.layerY以事件触发元素内界的左上角为参考点(包括滚动距离,当有边框时,可能出现负数) 然后是DOM对象高度属性分析 1.

    javascript 事件对象 坐标事件说明

    测试浏览器的版本: IETester 6 ,7 IE 8.0 Firefox 3.5.5 Chrome 4.1.249.1064 (45376) Opera 9.64 Safari 4.0 先来看看各个主流浏览器都有哪些坐标属性以及它们的意义 在IE中 event.offsetX event.offsetY 相对于e....

    鼠标事件clientX、clientY

    clientX、clientY、pageX、pageY、screenX、screenY、offsetX、offsetY

    JS大全 web编程

     以上主要指IE之中,FireFox差异如下: IE6.0、FF1.06+: clientWidth = width + padding clientHeight = height + padding offsetWidth = width + padding + border offsetHeight = height + padding + ...

    js实现鼠标拖拽效果

    鼠标相对于元素的坐标点(不计算边框 ) 事件对象.offsetX(水平方向) 事件对象.offsetY(垂直方向) 鼠标相对于元素的坐标点(计算边框 ) 事件对象.clientX; 事件对象.clientY; 元素可用区域的边缘到光标的位置 不...

    js脚本学习 比较实用的基础

    event.offsetX 返回当前鼠标悬停X坐标值 event.offsetY 返回当前鼠标悬停Y坐标值 [removed](document.lastModified) 网页最后一次更新时间 [removed]=x 当双击鼠标产生事件 [removed]=x 单击鼠标键产生事件 ...

    [转]分析x,offsetX clientX screenX,pageX,y,offsetY clientY screenY,pageY之间的区别

    NULL 博文链接:https://meizhi.iteye.com/blog/576133

    js 鼠标位置 div拖拽

    该代码演示了各个鼠标位置属性,并实现了一个div拖拽框,支持ie和firefox

    javascript Event对象详解及使用示例

    Event代表事件状态,如事件发生的元素,键盘状态,鼠标位置和鼠标按钮状态。一旦事件发生,便会生成Event对象,如单击一个按钮,浏览器的内存中就产生相应的 event对象。 event对象只在事件发生的过程中才有效。 ...

    javascript offsetX与layerX区别

    一个简单的例子:判断...evnt) { evnt = window.event; } var offsetX = evnt.offsetX ? evnt.offsetX : evnt.layerX; if(evnt.offsetX < ele.offsetWidth / 2) { return ‘left’; } else { return ‘right’; } }

    javascript offsetX与layerX区别.docx

    javascript offsetX与layerX区别.docx

    解决ASP.NET AJAX在frame及iframe中跨域访问的问题

    1、为ScriptManager添加脚本引用,不从ScriptResource.axd中加载MicrosoftAjax.js脚本,而是直接加载 ~/ScriptLibrary/System.Web.Extensions/1.0.61025.0/MicrosoftAjax.js" /> 2、修改MicrosoftAjax....

Global site tag (gtag.js) - Google Analytics