w3c与微软(IE)事件注册区别 -Tom

严格来说,有2中不同的模型:W3C模型和微软模型,除IE之外W3C模型支持所有的现代浏览器,而微软模型只支持IE,使用W3C模型的代码如下:

// 格式:target.addEventListener( type, function, useCapture );  // 例子:  var myIntro = document.getElementById(‘intro‘);myIntro.addEventListener(‘click‘, introClick, false);

使用IE模型的代码如下:

// 格式: target.attachEvent ( ‘on‘ + type, function );  // 例子:  var myIntro = document.getElementById(‘intro‘);myIntro.attachEvent(‘onclick‘, introClick);

introClick的代码如下:

function introClick() {      alert(‘You clicked the paragraph!‘);  }

事实上,要做出通用的话,我们可以自定义一个函数以支持跨浏览器:

function addEvent(elem, type, fn) {    if (elem.attachEvent) {        elem.attachEvent(‘on‘ + type, fn);        return;    }    if (elem.addEventListener) {        elem.addEventListener(type, fn, false);    }}

该函数首先检查attachEvent和addEventListener属性,谁可以就用谁,这两种类型的模型都支持删除句柄功能,参考下面的removeEvent函数。

function removeEvent(elem, type, fn) {    if (elem.detachEvent) {        elem.detachEvent(‘on‘ + type, fn);        return;    }    if (elem.removeEventListener) {        elem.removeEventListener(type, fn, false);    }}

你可以这样使用:

var myIntro = document.getElementById(‘intro‘);addEvent(myIntro, ‘click‘, function () {    alert(‘YOU CLICKED ME!!!‘);});

注意到我们传入了一个匿名函数作为第三个参数,JavaScript运行我们定义和执行匿名函数,这种匿名函数特别适合作为参数传递,实际上我们也可以传递有名的函数(代码如下),但是你们函数更容易做。

如果你只想在第一次click的时候触发一个函数,你可以这么做:

// 注意:前提是我们已经定于好了addEvent/removeEvent函数// (定义好了才能使用哦)  

var myIntro = document.getElementById(‘intro‘);addEvent(myIntro, ‘click‘, oneClickOnly);

function oneClickOnly() {    alert(‘WOW!‘);    removeEvent(myIntro, ‘click‘, oneClickOnly);} 

当第一次触发以后,我们就立即删除该句柄,但是有匿名函数的话却很难将自身的引用删除,不过实际上可以通过如下的形式来做(只不过有点麻烦):

addEvent(myIntro, ‘click‘, function () {    alert(‘WOW!‘);    removeEvent(myIntro, ‘click‘, arguments.callee);}); 

这里我们是有了arguments对象的callee属性,arguments对象包含了所有传递进来的参数以及该函数自身(callee),这样我们就可以放心地删除自身的引用了。

Event对象

另外一个非常重要的内容是Event对象,当事件发生的时候出发某个函数,该Event对象将自动在函数内可用,该对象包含了很多事件触发时候的信 息,但IE却没有这么实现,而是自己实现的,IE浏览器是通过全局对象window下的event属性来包含这些信息,虽然不是大问题,但我们也需要注意 一下,下面的代码是兼容性的:

function myEventHandler(e) {

    // 注意参数e    // 该函数调用的时候e是event对象(W3C实现)

    // 兼容IE的代码    e = e || window.event;

    // 现在e就可以兼容各种浏览器了

}

// 这里可以自由地绑定事件了

这里判断e对象(Event对象)是否存在我们使用了OR操作符:如果e不存在(为null, undefined,0等)的时候,将window.event赋值给e,否则的话继续使用e。通过这方式很快就能在多浏览器里得到真正的Event对象,如果你不喜欢这种方式的话,你可以使用if语句来处理:

if (!e) {    e = window.event;} // 没有else语句,因为e在其它浏览器已经定义了

另外Event对象下的命令和属性都很有用,遗憾的是不不能全兼容浏览器,例如当你想取消默认的行为的时候你可以使用Event对象里的preventDefault()方法,但IE里不得不使用对象的returnValue属性值来控制,兼容代码如下:

function myEventHandler(e) {    e = e || window.event;    // 防止默认行为    if (e.preventDefault) {        e.preventDefault();    } else {        e.returnValue = false;    }}

例如,当你点击一个连接的时候,默认行为是导航到href里定义的地址,但有时候你想禁用这个默认行为,通过returnValue和preventDefault就可以实现,Event对象里的很多属性在浏览器里都不兼容,所以很多时候需要处理这些兼容性代码。

注意:现在很多JS类库都已经封装好了e.preventDefault代码,也就是说在IE里可用了,但是原理上依然是使用returnValue来实现的。

时间: 2024-10-12 03:28:00

w3c与微软(IE)事件注册区别 -Tom的相关文章

jQuery 事件注册和绑定及this与event.target的区别浅析

最近小码哥,在研究学习nodejs以及相关框架webpack.express.reactjs等等,为了将来,为了RMB,小码哥牢记自我充电,以备不时之需. 在学习reactjs的时候,在前辈ruanyifeng的博文里看到了一个以前没怎么注意的知识点.是与this和event.target之间的区别有关的.当时感觉就蒙了,发现event.target貌似印象不深啊,,瞬间小码哥开启了奔跑模式,,, 各种baidu,各种Chrome biying等等,发现区分不难,就是比较细致.不细分析,有点晕!

IE的事件与w3c事件的区别

14. offsetWidth, scrollLeft, scrollHeight?     scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离 scrollHeight: 获取对象的滚动高度. offsetWidth:获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的宽度. http://bluenemo.iteye.com/blog/1263429 15. IE的事件与w3c事件的区别?w3c事件流: 从根文档(html)开始遍历所有

Ms和W3c中事件注册中的this问题

Ms中的事件注册: 1 ele.attachEvent('on' + type, fnHandler) W3c中事件注册: 1 ele.addEventListener(type, fnHandler, false) ?有时我们要在事件注册的函数引用里,引用调用该事件监听器的当前对象 如果是W3c可以直接用this,形如: 1 2 3 function fnHandler(){     console.log(this); } fnHandler中的this就相当于ele了 但是在IE中是不行的

c#之委托和事件的区别

下面开始对事件进行介绍 1.定义事件以及事件的编译原理 首先定义事件对应的委托: 1 public delegate void ThreeClickEventDel(); 然后对应事件变量:(其实就是在委托前面加一个event) public event ThreeClickEventDel ThreeClickEvent; 反编译之后:是:一个“私有委托”和两个“公有”的“add”和“remover”方法 1)因为是私有委托:所以只有类的内部可以调用,在类外部就不能被调用.创建的类的实例也是不

C#中委托和事件的区别

大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法.事件可以被看作一个委托类型的变量,通过事件注册.取消多个委托或方法.本篇分别通过委托和事件执行多个方法,从中体会两者的区别. □ 通过委托执行方法 class Program { static void Main(string[] args) { Example example = new Example(); example.Go(); Console.ReadKey(); } } public class Example { pu

c# 委托与事件的区别

委托与事件的区别 委托和事件没有可比性,因为委托是数据类型,事件是对象(可以理解为对委托变量的封装.),下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别.事件的内部是用委托实现的.(举例子:三种实现事件方式的区别(直接用委托实现.用私有委托+公有方法模拟事件,直接用event事件实现)) 因为对于事件来讲,外部只能“注册自己+=.注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这

onchange事件与onpropertychange事件的区别

1.onchange事件与onpropertychange事件的区别:onchange事件在内容改变(两次内容有可能还是相等的)且失去焦点时触发:onpropertychange事件却是实时触发,即每增加或删除一个字符就会触发,通过js改变也会触发该事件,但是该事件IE专有.2.oninput事件与onpropertychange事件的区别:oninput事件是IE之外的大多数浏览器支持的事件,在value改变时触发,实时的,即每增加或删除一个字符就会触发,然而通过js改变value时,却不会触

C#中委托和事件的区别实例解析

这篇文章主要介绍了C#中委托和事件的区别,并分别以实例形式展示了通过委托执行方法与通过事件执行方法,以及相关的执行流程与原理分析,需要的朋友可以参考下 本文实例分析了C#中委托和事件的区别,分享给大家供大家参考之用.具体如下: 大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法.事件可以被看作一个委托类型的变量,通过事件注册.取消多个委托或方法.本篇分别通过委托和事件执行多个方法,从中体会两者的区别. 一.通过委托执行方法 1 2 3 4 5 6 7 8 9 10 11 12 13 1

鼠标及事件注册(丫头,加油 ^_^)

鼠标触发事件有以下几种 鼠标控制光标移动到目标元素上的那一刻, 首先触发mouseover 之后如果光标继续在元素上移动,则不断触发mousemove 如果按下鼠标上的设备(左键,右键,滚轮--), 则触发mousedown 当设备弹起的时候触发mouseup 目标元素的滚动条发生移动时(滚动滚轮/拖动滚动条..)触发scroll 滚动滚轮触发mousewheel,注意这个要区别于scroll 鼠标移出元素的那一刻,触发mouseout 事件注册 了解事件注册最好先初步了解下 html DOM