event对象、srcElement、offsetX 在 firefox中的解决方案

问题一:在IE中event作为window对象的一个属性可以直接使用,但是在Firefox中却使用了W3C的模型,它是通过传参的方法来传播事件的,也就是说你需要为你的函数提供一个事件响应的接口,也就是在执行引用了event这个属性的方法时候,这个方法要传一个参数进去。

解决方案:第一种 显式传输event对象。第二种 使用自定义的函数生成对象。

function getEvent() //同时兼容ie和ff的写法
{
if(document.all)   return window.event;   
func=getEvent.caller;       
while(func!=null){
var arg0=func.arguments[0];
if(arg0)
{
if((arg0.constructor==Event || arg0.constructor ==MouseEvent) || (typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation))
{
return arg0;
}
}
func=func.caller;
}
return null;
}

这样,使用var evt = getEvent(); 就可以生成一个evt对象,替代之前使用的event即可。

问题二:IE下,event对象有srcElement属性,但是没有target属性;Firefox下,event对象有target属性,但是没有srcElement属性.

event.srcElement从字面上可以看出来有以下关键字:事件,源     他的意思就是:当前事件的源,我们可以调用他的各种属性 就像:document.getElementById("")这样的功能,IE下,event对象有srcElement属性,但是没有target属性;Firefox下,event对象有target属性,但是没有srcElement属性.但他们的作用是相当的,即:firefox 下的 event.target = IE 下的 event.srcElement
解决方法:

第一种 使用obj(obj = event.srcElement ? event.srcElement : event.target;)来代替IE下的event.srcElement或者Firefox下的event.target.

第二种 elm = event.srcElement || event.target;

问题三 FF中没有event.offsetX

解决方案:判断offsetX属性是否为未定义("undefine"),调用自定义函数getoffset

function (evt)
{
var target = evt.target;
if (target.offsetLeft == undefined)
{
    target = target.parentNode;
}
var pageCoord = (target);
var eventCoord =
{
    x: window.pageXOffset + evt.clientX,
    y: window.pageYOffset + evt.clientY
};
var offset =
{
    offsetX: eventCoord.x - pageCoord.x,
    offsetY: eventCoord.y - pageCoord.y
};
return offset;
}

function (element)
{
var coord = {x: 0, y: 0};
while (element)
{
    coord.x += element.offsetLeft;
    coord.y += element.offsetTop;
    element = element.offsetParent;
}
return coord;
}程序内加上判断:

if (evt.offsetX == undefined)   //Firefox
{
var evtOffsets = getOffset(evt);
n_offsetX=evtOffsets.offsetX;
n_offsetY=evtOffsets.offsetY;
}
else
{
n_offsetX=evt.offsetX;
n_offsetY=evt.offsetY;
}

即可。

FF与IE还有很多不兼容的地方,最佳方案是使用第三方的JS库。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值