一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

firefox 和 ie 事件處理的細節,研究,再研究 書寫同時兼容ie和ff的事件處理代碼

在ie中,事件對象是作為一個全局變量來保存和維護的。 所有的瀏覽器事件,不管是用戶觸發的,還是其他事件, 都會更新window.event 對象。 所以在代碼中,只要輕松調用 window.event 就可以輕松獲取 事件對象, 再 event.srcElement 就可以取得觸發事件的元素進行進一步處理在ff中, 事件對象卻不是全局對象,一般情況下,是現場發生,現場使用,ff把事件對象自動傳遞給對應的事件處理函數。 在代碼中,函數的第一個參數就是ff下的事件對象了。
以上是我個人對兩個瀏覽器下的事件處理方法的粗淺理解,可能說得不是很明白,我寫些代碼來
詳細說明一下
復制代碼 代碼如下:
<button id="btn1">按鈕1</button>
<button id="btn2">按鈕2</button>
<button id="btn3">按鈕3</button>
<script>
window.onload=function(){
document.getElementById("btn1").onclick=foo1
document.getElementById("btn2").onclick=foo2
document.getElementById("btn3").onclick=foo3
}
function foo1(){
//ie中, window.event使全局對象
alert(window.event) // ie下,顯示 "[object]" , ff下顯示 "undefined"
//ff中, 第一個參數自動從為 事件對象
alert(arguments[0]) // ie下,顯示 "undefined", ff下顯示 "[object]"
}
function foo2(e){
alert(window.event) // ie下,顯示 "[object]" , ff下顯示 "undefined"
//注意,我從來沒有給 foo2傳過參數哦。 現在 ff自動傳參數給 foo2, 傳的參數e 就是事件對象了
alert(e) // ie下,顯示 "undefined", ff下顯示 "[object]"
}
function foo3(){ //同時兼容ie和ff的寫法,取事件對象
alert(arguments[0] || window.event) // ie 和 ff下,都顯示 "[object]"
var evt=arguments[0] || window.event
var element=evt.srcElement || evt.target //在 ie和ff下 取得 btn3對象
alert(element.id) // btn3
}
</script>

看到這里,我們似乎對 ie和ff的事件處理方式都已經理解了,并找到了解決的辦法。
但是。。。。事情還沒有結束。
看代碼
復制代碼 代碼如下:
<button id="btn" onclick="foo()">按鈕1</button>
<script>
function foo(){
alert(arguments[0] || window.event)
}
</script>

很不幸,我們 foo給我們的結果是 undefined, 而不是期望的 object
原因在于 事件綁定的方式
onclick="foo()" 就是直接執行了, foo() 函數,沒有任何參數的,
這種情況下 firefox沒有機會傳遞任何參數給foo
而 btn.onclick=foo 這種情況, 因為不是直接執行函數,firefox才有機會傳參數給foo
解決方法:
方法一:比較笨的方法,既然 firefox沒有機會傳參數,那么自己勤快點,自己傳
復制代碼 代碼如下:
<button id="btn" onclick="foo(event)">按鈕</button>
<script>
function foo(){
alert(arguments[0] || window.event)
var evt=arguments[0] || window.event
var element=evt.srcElement || evt.target
alert(element.id)
}
</script>

方法二: 自動查找
復制代碼 代碼如下:
<button id="btn4" onclick="foo4()">按鈕4</button>
<script>
function foo4(){
var evt=getEvent()
var element=evt.srcElement || evt.target
alert(element.id)
}
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;
}
</script>

方法二由 lostiNET原創,我在其基礎上有所改進, 原函數如下
復制代碼 代碼如下:
function SearchEvent()
{
//IE
if(document.all)
return window.event;
func=SearchEvent.caller;
while(func!=null)
{
var arg0=func.arguments[0];
if(arg0)
{
if(arg0.constructor==Event)
return arg0;
}
func=func.caller;
}
return null;
}

簡單總結:
以上兩個解決方法中,都正確處理 ff和ie下 的事件處理 (不管是onclick="foo()",方式還是 onclick=foo方式)
但是個人建議用 getEvent() 方法來統一處理 事件問題。
先寫到這里,大家繼續。。

JavaScript技術firefox 和 ie 事件處理的細節,研究,再研究 書寫同時兼容ie和ff的事件處理代碼,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 伊人久久大香线焦在观看 | 久久国产精品视频一区 | 欧美激情免费a视频 | 久久99精品久久久久久青青91 | 国产大片在线观看 | 精品9e精品视频在线观看 | 久久伊人热精品老鸭窝 | 99在线视频免费观看 | 亚洲逼院 | 青青草一区二区免费精品 | 欧美大吊视频 | 九一在线观看 | 亚洲小视频在线观看 | 国产乱轮视频 | 亚洲福利一区福利三区 | 开心激情五月网 | 丁香激情综合 | 一本久久精品一区二区 | 国产亚洲精品激情都市 | 成人在线午夜 | 露脸真实国产精品自在 | 欧美激情视频一区 | 国产一级久久免费特黄 | 美国黑人毛片 | 国产原创视频 | 手机在线观看亚洲国产精品 | 色婷婷色99国产综合精品 | 99久久久久国产精品免费 | 中文字幕日韩精品一区口 | 五月婷丁香 | 91在线视频在线观看 | 久久一区二区三区免费播放 | 国产精品久久久久影视青草 | 国内自产拍自a免费毛片 | 99国产精品免费观看视频 | 999精品视频 | 亚洲综合激情视频 | 黄色在线视频播放 | 免费特黄视频 | 奇米久草| 国产激情一区二区三区成人91 |