IE和Firefox下event事件雜談
更新時(shí)間:2009年12月18日 21:35:36 作者:
如果在使用javascript的時(shí)候涉及到event處理,就需要知道event在不同的瀏覽器中的差異。
因?yàn)閖avascript的事件模型有三種,它們分別是NN4、IE4+和W3C/Safari;這也造成了在不同的瀏覽器中處理event的差異,這里結(jié)合一些零碎的代碼來(lái)說(shuō)明如何做到event在IE4+和Firefox下的正常工作。
首先看如下代碼:
function doEventThing(eventTag){
var event = eventTag||window.event;
var currentKey = event.charCode||event.keyCode;
var eventSource =window.event.srcElement||eventTag.target;
}
這段代碼主要是為了處理鍵盤(pán)事件的,在IE中event作為window對(duì)象的一個(gè)屬性可以直接使用,但是在Firefox中卻使用了W3C的模型,它是通過(guò)傳參的方法來(lái)傳播事件的,也就是說(shuō)你需要為你的函數(shù)提供一個(gè)事件響應(yīng)的接口,在上述函數(shù)中,
eventTag扮演的就是這個(gè)角色。
var event = eventTag||window.event;
這段代碼可以根據(jù)瀏覽器的不同來(lái)得到正確的event,并在程序中使用,如果在IE4+下面使用這段代碼,因?yàn)閑ventTag為null可以保證event = window.event,但是如果在Firefox下運(yùn)行的話則因?yàn)槭止さ慕o定了eventTag所以var event = eventTag。根據(jù)對(duì)這一段代碼的分析我們也不難看出可以對(duì)doEventThing方法進(jìn)行如下的改造(因?yàn)閖avascript允許我們?cè)诙xfunction的時(shí)候不明確指出參數(shù)的數(shù)量):
function doEventThing(){
var event = arguments[0]||window.event;
//other code
}
在Firefox下arguments[0]在特定的場(chǎng)合(沒(méi)有顯式的指定function參數(shù)數(shù)量的時(shí)候)被做為傳播事件的參數(shù)來(lái)使用…………
至于var currentKey = event.charCode||event.keyCode;也是不同的瀏覽器所致,在IE4+下面記錄鍵盤(pán)的是keyCode,但是在Firefox下的卻是charCode,為此我們需要處理他們的差異。
還有一個(gè)差異就是事件源的獲?。和ㄟ^(guò)語(yǔ)句
var eventSource = window.event.srcElement||eventTag.target;
我們也看到了IE與W3C的不同。
經(jīng)過(guò)上面的包裝,我們基本上可以在IE4+和Firefox下面順利的使用事件機(jī)制了,當(dāng)然如果為了通用性可以對(duì)這種差異進(jìn)封裝來(lái)形成自己的Event對(duì)象在程序中誤差別的使用事件對(duì)象,這里就不在介紹了。
接下來(lái)分析事件的綁定:大概分為如下5種
1、綁定到元素,這也是比較常見(jiàn)的一種比如:
<input type="button" onclick="doEventThing(event)">
,這樣我們就把doEventThing綁定到了該button對(duì)象上,點(diǎn)擊此按鈕事件就被觸發(fā)。
2、綁定事件到對(duì)象:這也是比較常見(jiàn)的一種,特別是在IE4+下面:
document.getElementById("divid").onclick = doEventThing;
3、使用<script for>進(jìn)行事件的綁定,這只在IE4+下有用(為buttong1綁定事件,邏輯在script塊中書(shū)寫(xiě)event來(lái)指定怎么觸發(fā)事件):
<script event="onclick" for="button1">
// script statements here
</script>
4、使用 IE5/Windows 的 attachEvent() 方法
5、使用 W3C DOM 的 addEventListener() 方法
addEventListener("eventType",listenerReference,captureFlag);
第三個(gè)參數(shù)則是一個(gè) Boolean 值,指明該結(jié)點(diǎn)是否以DOM中所謂的捕捉模式來(lái)偵聽(tīng)事件。對(duì)于一個(gè)典型的事件偵聽(tīng)器來(lái)說(shuō),第三個(gè)參數(shù)應(yīng)該為false(假)。
prototype在綁定事件的時(shí)候兼容IE和W3C的時(shí)候做的處理如下:
_observeAndCache: function(element, name, observer, useCapture) {
if (!this.observers) this.observers = [];
if (element.addEventListener) {//W3C DOM
this.observers.push([element, name, observer, useCapture]);
element.addEventListener(name, observer, useCapture);
} else if (element.attachEvent) {//IE5/Windows
this.observers.push([element, name, observer, useCapture]);
element.attachEvent('on' + name, observer);
}
}
撇開(kāi)this.observers.pust([element,name,observer,useCapture])不談,我們對(duì)4、5所說(shuō)的事件綁定就很清楚了。我們知道prototype的此方法的useCapture在IE下沒(méi)有作用,只對(duì)W3C的事件處理機(jī)制起作用。
首先看如下代碼:
復(fù)制代碼 代碼如下:
function doEventThing(eventTag){
var event = eventTag||window.event;
var currentKey = event.charCode||event.keyCode;
var eventSource =window.event.srcElement||eventTag.target;
}
這段代碼主要是為了處理鍵盤(pán)事件的,在IE中event作為window對(duì)象的一個(gè)屬性可以直接使用,但是在Firefox中卻使用了W3C的模型,它是通過(guò)傳參的方法來(lái)傳播事件的,也就是說(shuō)你需要為你的函數(shù)提供一個(gè)事件響應(yīng)的接口,在上述函數(shù)中,
eventTag扮演的就是這個(gè)角色。
var event = eventTag||window.event;
這段代碼可以根據(jù)瀏覽器的不同來(lái)得到正確的event,并在程序中使用,如果在IE4+下面使用這段代碼,因?yàn)閑ventTag為null可以保證event = window.event,但是如果在Firefox下運(yùn)行的話則因?yàn)槭止さ慕o定了eventTag所以var event = eventTag。根據(jù)對(duì)這一段代碼的分析我們也不難看出可以對(duì)doEventThing方法進(jìn)行如下的改造(因?yàn)閖avascript允許我們?cè)诙xfunction的時(shí)候不明確指出參數(shù)的數(shù)量):
復(fù)制代碼 代碼如下:
function doEventThing(){
var event = arguments[0]||window.event;
//other code
}
在Firefox下arguments[0]在特定的場(chǎng)合(沒(méi)有顯式的指定function參數(shù)數(shù)量的時(shí)候)被做為傳播事件的參數(shù)來(lái)使用…………
至于var currentKey = event.charCode||event.keyCode;也是不同的瀏覽器所致,在IE4+下面記錄鍵盤(pán)的是keyCode,但是在Firefox下的卻是charCode,為此我們需要處理他們的差異。
還有一個(gè)差異就是事件源的獲?。和ㄟ^(guò)語(yǔ)句
var eventSource = window.event.srcElement||eventTag.target;
我們也看到了IE與W3C的不同。
經(jīng)過(guò)上面的包裝,我們基本上可以在IE4+和Firefox下面順利的使用事件機(jī)制了,當(dāng)然如果為了通用性可以對(duì)這種差異進(jìn)封裝來(lái)形成自己的Event對(duì)象在程序中誤差別的使用事件對(duì)象,這里就不在介紹了。
接下來(lái)分析事件的綁定:大概分為如下5種
1、綁定到元素,這也是比較常見(jiàn)的一種比如:
<input type="button" onclick="doEventThing(event)">
,這樣我們就把doEventThing綁定到了該button對(duì)象上,點(diǎn)擊此按鈕事件就被觸發(fā)。
2、綁定事件到對(duì)象:這也是比較常見(jiàn)的一種,特別是在IE4+下面:
document.getElementById("divid").onclick = doEventThing;
3、使用<script for>進(jìn)行事件的綁定,這只在IE4+下有用(為buttong1綁定事件,邏輯在script塊中書(shū)寫(xiě)event來(lái)指定怎么觸發(fā)事件):
<script event="onclick" for="button1">
// script statements here
</script>
4、使用 IE5/Windows 的 attachEvent() 方法
5、使用 W3C DOM 的 addEventListener() 方法
addEventListener("eventType",listenerReference,captureFlag);
第三個(gè)參數(shù)則是一個(gè) Boolean 值,指明該結(jié)點(diǎn)是否以DOM中所謂的捕捉模式來(lái)偵聽(tīng)事件。對(duì)于一個(gè)典型的事件偵聽(tīng)器來(lái)說(shuō),第三個(gè)參數(shù)應(yīng)該為false(假)。
prototype在綁定事件的時(shí)候兼容IE和W3C的時(shí)候做的處理如下:
復(fù)制代碼 代碼如下:
_observeAndCache: function(element, name, observer, useCapture) {
if (!this.observers) this.observers = [];
if (element.addEventListener) {//W3C DOM
this.observers.push([element, name, observer, useCapture]);
element.addEventListener(name, observer, useCapture);
} else if (element.attachEvent) {//IE5/Windows
this.observers.push([element, name, observer, useCapture]);
element.attachEvent('on' + name, observer);
}
}
撇開(kāi)this.observers.pust([element,name,observer,useCapture])不談,我們對(duì)4、5所說(shuō)的事件綁定就很清楚了。我們知道prototype的此方法的useCapture在IE下沒(méi)有作用,只對(duì)W3C的事件處理機(jī)制起作用。
相關(guān)文章
下拉菜單點(diǎn)擊實(shí)現(xiàn)連接跳轉(zhuǎn)功能的js代碼
下拉菜單點(diǎn)擊實(shí)現(xiàn)連接跳轉(zhuǎn)效果想必不是很常見(jiàn)吧,下面與大家分享下具體的實(shí)現(xiàn)另有實(shí)例,感興趣的朋友可以參考下哈2013-05-05
利用HTML5+Socket.io實(shí)現(xiàn)搖一搖控制PC端歌曲切換
這篇文章主要介紹了利用HTML5+Socket.io實(shí)現(xiàn)搖一搖控制PC端歌曲切換,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-01-01
微信小程序返回上一級(jí)頁(yè)面的實(shí)現(xiàn)代碼
這篇文章主要介紹了微信小程序返回上一級(jí)頁(yè)面的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
js getBoundingClientRect使用方法詳解
這篇文章主要介紹了js getBoundingClientRect使用方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
js使用xml數(shù)據(jù)載體實(shí)現(xiàn)城市省份二級(jí)聯(lián)動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了js使用xml數(shù)據(jù)載體實(shí)現(xiàn)城市省份二級(jí)聯(lián)動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
javascript中xml操作實(shí)現(xiàn)代碼
好久沒(méi)寫(xiě)了。感覺(jué)今時(shí)今日,HTML5 還依然只是一種玩票的東東。但愿 w3c 的標(biāo)準(zhǔn)可以早一點(diǎn)出臺(tái),不要讓各種瀏覽器的兼容問(wèn)題和支持程度搞死2011-11-11

