如果在使用javascript的时候涉及到event处理,就需要知道event在不同的浏览器中的差异,主要的JavaScript的事件模型有三种(参考《SupportingThreeEventModelsatOnce》),它们分别是NN4、IE4+和W3C/Safar。

1. window.event

先看一段代码


function et()
{
alert(event);//IE: [object]
}

以上代码在IE运行的结果是[object],而在Firefox无法运行。

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

添加对event判断,根据浏览器的不同来得到正确的event:


function et()
{
evt=evt?evt:(window.event?window.event:null);
  //兼容IE和Firefox
alert(evt);
}

2. 键盘值的取得

IE和Firefox获取键盘值的方法不同,可以理解,Firefox下的event.which与IE下的event.keyCode相当。关于彼此不同,可参考《键盘事件中keyCode、which和charCode 的兼容性测试》


复制代码


function myKeyPress(evt){
//兼容IE和Firefox获得keyBoardEvent对象
evt = (evt) ? evt : ((window.event) ? window.event : "")
//兼容IE和Firefox获得keyBoardEvent对象的键值
var key = evt.keyCode?evt.keyCode:evt.which;
if(evt.ctrlKey && (key == 13 || key == 10)){
      //同时按下了Ctrl和回车键
//do something;
}
}

3. 事件源的获取

在使用事件委托的时候,通过事件源获取来判断事件到底来自哪个元素,但是,在IE下,event对象有srcElement属性,但是没有target属性;Firefox下,even对象有target属性,但是没有srcElement属性。


ele=function(evt){ //捕获当前事件作用的对象
evt=evt||window.event;
  return
  (obj=event.srcElement?event.srcElement:event.target;);
}

4. 事件监听

在事件监听处理方面,IE提供了attachEvent和detachEvent两个接口,而Firefox提供的是addEventListener和removeEventListener。

最简单的兼容性处理就是封装这两套接口:


function addEvent(elem, eventName, handler) {
  if (elem.attachEvent) {
    elem.attachEvent("on" + eventName, function(){
                    handler.call(elem)});
    //此处使用回调函数call(),让this指向elem
  } else if (elem.addEventListener) {
    elem.addEventListener(eventName, handler, false);
  }
}
function removeEvent(elem, eventName, handler) {
  if (elem.detachEvent) {
    elem.detachEvent("on" + eventName, function(){
                    handler.call(elem)});
    //此处使用回调函数call(),让this指向elem
  } else if (elem.removeEventListener) {
    elem.removeEventListener(eventName, handler, false);
  }
}

需要特别注意,Firefox下,事件处理函数中的this指向被监听元素本身,而在IE下则不然,可使用回调函数call,让当前上下文指向监听的元素。

5. 鼠标位置

IE下,even对象有x,y属性,但是没有pageX,pageY属性;Firefox下,even对象有pageX,pageY属性,但是没有x,y属性。

使用mX(mX = event.x ? event.x : event.pageX;)来代替IE下的event.x或者Firefox下的event.pageX。复杂点还要考虑绝对位置。


function getAbsPoint(e){
var x = e.offsetLeft, y = e.offsetTop;
while (e = e.offsetParent) {
x += e.offsetLeft;
y += e.offsetTop;
}
alert("x:" + x + "," + "y:" + y);
}

最新资讯
Canalys:2020第三季度印度智能手机出货量约为5000万部

Canalys:2020第三季度

研究公司Canalys周四表示,2020年第三季度印度智能手机
井贤栋:金融服务业数字化不仅是把产品搬到线上

井贤栋:金融服务业数字

井贤栋在路演时表示,金融服务业的数字化也不仅是简单的
井贤栋:花呗利率制定和展示均需符合监管有关规定

井贤栋:花呗利率制定和

井贤栋今日在路演时表示,截至2020年6月30日止12个月期
蚂蚁集团:公司是中国最大的线上保险服务平台

蚂蚁集团:公司是中国最

蚂蚁集团数字金融事业群总裁黄浩表示,截至2020年6月30
蚂蚁打新在即 网上发行股票无流通限制及限售期安排

蚂蚁打新在即 网上发

蚂蚁集团网上发行的股票无流通限制及限售期安排,自本次
蚂蚁集团:平台上大多数消费贷款的年利率在14.6%以下

蚂蚁集团:平台上大多数

截至2020年6月,蚂蚁集团表示平台上大多数消费贷款的年
最新文章
详解Vue的ref特性的使用

详解Vue的ref特性的使

这篇文章主要介绍了详解Vue的ref特性的使用,文中通过
vue学习笔记之slot插槽基本用法实例分析

vue学习笔记之slot插

这篇文章主要介绍了vue学习笔记之slot插槽基本用法,结
vue跳转方式(打开新页面)及传参操作示例

vue跳转方式(打开新页

这篇文章主要介绍了vue跳转方式(打开新页面)及传参操作,
vue学习笔记之过滤器的基本使用方法实例分析

vue学习笔记之过滤器

这篇文章主要介绍了vue学习笔记之过滤器的基本使用方
js获取本日、本周、本月的时间代码

js获取本日、本周、本

本篇文章给大家分享的内容是利用js如何获取本日、本周
node crawler如何添加promise支持

node crawler如何添加

这篇文章主要介绍了node crawler如何添加promise支持,