浏览器兼容的获取event.offsetX的最简单方法

很多时候,我们都需要获取event.offsetX数值,但是Firefox的event不支持offsetX属性,这给我们造成了一定的困难,虽然Firefox提供了一个layerX属性,但是该属性需要和CSS的position属性配合才能获取我们想要的数值,这是个比较大的局限,他限制了页面样式的设计,而且,layerX的数值严格意义上并不等同于offsetX,offsetX是相对于元素的内边距,而layerX是相对于外边距,这时如果边框较宽,两者取值会有误差,或者说,需要减去边框的宽度。

在网上经过搜索,大部分的方案都是通过offsetParent逐级计算,或者利用jQuery的$(e.target).offset().left进行计算,要么无法适应有滚动条的情况,要么依赖第三方库,有没有更简单的办法呢?

经过研究,找到了如下的计算方法,非常简单:

function getOffsetX(event){
    var evt =event||window.event;
    var srcObj = evt.target || evt.srcElement;
    if (evt.offsetX){
        return evt.offsetX;
    }else{
        var rect = srcObj.getBoundingClientRect();
        var clientx = evt.clientX;
        return clientx - rect.left;
    }
}

或者用一行代码:

return evt.offsetX || (evt.clientX - srcObj.getBoundingClientRect().left);

这个计算方法,在IE8以上,Firefox、Chrome等浏览器上,都测试通过,在一些复杂的页面环境中,测试结果也都正确。唯一的一个例外是,如果table的border属性不为0的话,会出现一个像素的偏差,现在还不知道原因。

时间: 2024-08-13 20:59:05

浏览器兼容的获取event.offsetX的最简单方法的相关文章

获取json格式字符串的简单方法

有的时候需要找一些Json格式的字符串,可以打开任意一个网页进入到调试模式,然后看network相关的访问信息,就可以获取到. 比如: 在记笔记的时候,点击保存后,会发出一些请求,然后有相应的相应,任意找一个request,切换到Response标签, 如: 然后把这个Response的内容考出来就是json格式的.如果要格式化,可以通过在线的格式化工具进行格式化.如: http://tool.oschina.net/codeformat/json 这个网站进行格式化. 格式化的结果如:

火狐和ie下获取javascript 获取event

javascript 获取event 先从一个简单的例子说起,一个简单的button控件如下: <input type='button' name='mybtn' id='mybtn' onclick='myFunc()'/> 然后为其注册事件,这样的情况,怎么在javascript里获取event呢,特别是firefox的情况.请看: <script type='text/javascript'> function myFunc(){ var ev = window.event

JS兼容方式获取浏览器的宽度

<script type="text/javascript"> //need to wait until onload so body is available window.onload = function(){ function getWindowWidth(){ if (window.innerWidth){ return window.innerWidth; } else if (document.documentElement.clientWidth){ ret

火狐浏览器获取event

由于各种浏览器对js文件的解析不同,加上各种浏览器的内核不一样,以及内核版本也不一样,所以获取event的方式也不一样. 使用原始的方式获取event是 这样的: document.body.onclick=function(e){ e=e||window.event; }; 实际上大家会想为什么要重新赋值,这是因为event是瞬间有效,所以要进行保存. 这中方式可以实现,但是要保证传递的参数有e. 还有一种方式是这样的: upAndDownListener : function(obj){ v

JavaScript常见火狐Firefox、IE浏览器兼容问题

1.关于event的用法 IE 中可以直接使用 event 对象,而 FF 中则不可以 解决方法一:var theEvent = window.event || arguments.callee.caller.arguments[0]; 解决方法二:是将 event 作为参数来传递function xxx(e){var theEvent = window.event || e;} 2.事件对象获取 IE:event.srcElement Mozilla:event.target Mozilla下

js在浏览器兼容教程:事件处理

如果在使用javascript的时候涉及到event处理,就需要知道event在不同的浏览器中的差异,主要的JavaScript的事件模型有三种(参考<Supporting Three Event Models at Once>),它们分别是NN4.IE4+和W3C/Safar. 1. window.event [分析说明]先看一段代码 function et(){ alert(event);//IE: [object]} 以上代码在IE运行的结果是[object],而在Firefox无法运行

[转]JAVA WEB 浏览器兼容问题汇总

首 先谈一下浏览器,虽然现在ie依然是浏览器市场的老大,大约占有67%的份额,但是由于其各方面的欠缺,用户开始选择其他浏览器作为自己浏览网页的主要 工具,比如firefox.theworld.maxthon.chrome.opera等等,在用户使用比较多的浏览器中,分为2大派系 - ie内核和非ie内核,像theworld.maxthon.greenbrower等等都属于ie内核,而firefox.chrome.opera则 为非ie内核,众多的浏览器使我们的web程序就出现了兼容问题,像ie就

JavaScript中浏览器兼容问题

浏览器兼容性问题是在实际开发中容易忽略而又最重要的一部分.我们在讲老版本浏览器兼容问题之前,首先要了解什么是能力检测,它是来检测浏览器有没有这种能力,即判断当前浏览器是否支持要调用的属性或者方法.下面做了一些简短的介绍. 1.innerText 和 innerContent 1)innerText 和 innerContent 的作用相同 2)innerText IE8之前的浏览器支持 3)innerContent 老版本的Firefox支持 4)新版本的浏览器两种方式都支持 // 老版本浏览器

浏览器兼容的实现table中通过拖拽改变列宽的最佳实践

在企业级应用中,表格是非常常见的展现方式,这时当列数据较长时,一种比较自然,体验也较好的处理方式就是通过拖拽改变列宽,这个功能在一些重量级JS组件库中都有提供,实现原理各有不同,但是一个共同点就是实现比较复杂,那我们通过很少的代码,常规的table结构,能实现这个功能么?本文将提供一个经过实际验证的实践,供开发者参考,扩展思路. 总体思路: 1.HTML结构: 为了简化代码,采用标准的HTML结构,即table-tr-td模式,无其他限制,在我们的实际应用中,表格非常复杂,但是核心技术没有变: