溫故而知新-JavaScript事件與兼容性相關(guān)

w簡(jiǎn)書的markdown不支持[toc]? ??

不知不覺(jué),從開始做android的項(xiàng)目后就很少寫JS了逊躁,最近項(xiàng)目中需要用到大量的H5伤锚,也來(lái)湊湊HTML5開發(fā)的熱鬧。。屯援。當(dāng)然前提要學(xué)好JS猛们,好記性不如爛筆頭,開始學(xué)著寫點(diǎn)筆記狞洋,提升學(xué)習(xí)效率~

這里只是記錄一些比較容易忘記弯淘,API之類的需要時(shí)再去查閱

[toc]

事件對(duì)象

接受對(duì)象的差異性

W3C可直接通過(guò)參數(shù)接收事件對(duì)象,而IDE自己定義了一個(gè)Event對(duì)象吉懊,通過(guò)window.event獲取庐橙。

兼容獲取事件對(duì)象的代碼
    <input type="button" id="btn" value="提交"/>
    <script>
        var btn = document.getElementById("btn");
        btn.onclick = function(event){
            var e = event || widnow.event;
            alert(e);
        }
    </script>

鼠標(biāo)事件

鼠標(biāo)事件的兼容性問(wèn)題

onmousemove:鼠標(biāo)移動(dòng)
onmousedown:鼠標(biāo)點(diǎn)擊
onmouseup:鼠標(biāo)松開
onmouseover:鼠標(biāo)移動(dòng)到元素區(qū)域內(nèi)
onmouseout :鼠標(biāo)移出元素

在這三個(gè)事件對(duì)象中,有一個(gè)button屬性借嗽,表示按下或者釋放的按鈕态鳖,遺忘的是對(duì)于這個(gè)button屬性,坑爹的IE也與W3C不同(怪不得你爹不要你了)

W3C中的button屬性

IE中的button屬性

可以看出恶导,IE和W3C在button屬性上各個(gè)數(shù)值所表示的按鈕和狀態(tài)都不一樣浆竭,但是一般我們只需要兼容W3C那三種就好了
兼容代碼

 function getButton(evt) {
            var e = evt || window.event;
            if (evt) {
                return e.button;
            } else
                if (window.event) {
                    switch(e.button) {
                        case 1 :
                            return 0;
                        case 4 :
                            return 1;
                        case 2 :
                            return 2;
                }
            }
        }

        document.onmouseup = function (evt) {
            if (getButton(evt) == 0) {
                alert('按下了左鍵!');
            } else if (getButton(evt) == 1) {
                alert('按下了中鍵!');
            } else if (getButton(evt) == 2) {
                alert('按下了右鍵!' ); }
        };

鼠標(biāo)事件-可視區(qū)和坐標(biāo)的獲取

可通過(guò)clienX,screex獲取,這個(gè)就不記錄了惨寿,查一下文檔即可

鍵盤事件

onkeydown
onkeypress:只對(duì)能在屏幕上輸出字符的按鈕有效果
onkeyup


屬性:
keyCode:鍵碼---獲取一個(gè)代碼邦泄,與鍵盤特定的鍵對(duì)應(yīng),與ASCII碼中對(duì)應(yīng)的編碼相同(不區(qū)分大小寫)
charCode:字符編碼 --- 只有在keypress中才包含值裂垦,對(duì)應(yīng)的是鍵所代碼的字符的ASCII編碼(區(qū)分大小寫)
document.onkeypress = function (event) {
    alert("charCode == "+ event.charCode); //得到相應(yīng)的 charCode

};
document.onkeydown = function (event) {
    alert("keyCode == "+ event.keyCode); //得到相應(yīng)的 keyCode

};

兼容性問(wèn)題:

不同瀏覽器中顺囊,獲取的keyCode(鍵碼)和charCode(字符編碼)有可能不一樣,要謹(jǐn)慎操作

事件對(duì)象的其他屬性

![](http://upload-images.jianshu.io/upload_images/205088-36015df534702463.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

事件冒泡

事件流:當(dāng)幾個(gè)具有事件的元素疊在一起的時(shí)候蕉拢,那么你點(diǎn)擊一個(gè)元素后特碳,所有層疊在你點(diǎn)擊范圍內(nèi)的元素都會(huì)觸發(fā)事件。

來(lái)個(gè)簡(jiǎn)單的圖感受一下晕换。

屏幕快照 2016-04-17 上午12.01.00.png

Button午乓,紫色和藍(lán)色的DIV都具有點(diǎn)擊事件,因?yàn)锽utton在最內(nèi)層届巩,當(dāng)點(diǎn)擊button時(shí)硅瞧,click事件會(huì)從內(nèi)往外觸發(fā)----這就是事件冒泡(特征:從里往外觸發(fā))
事件捕獲:與事件冒泡相反份乒,是從外往內(nèi)觸發(fā)

阻止冒泡

從前面的==事件的其他屬性==中看到恕汇,關(guān)于阻止事件冒泡IE和W3C有不同的屬性

IE:是通過(guò)cancelBubble = true 取消事件冒泡
W3C:調(diào)用stopProgagation()方法取消事件冒泡

阻止的兼容方法

function stopPro(event) {
    var e = event || window.event;
    window.event ? e.cancelBubble = true : e.stopPropagation(); }

事件的綁定

事件的綁定有兩種方式
一,傳統(tǒng)的事件綁定或辖,分為內(nèi)聯(lián)模型瘾英,腳本模型
二,DOM2級(jí)的現(xiàn)代事件綁定

傳統(tǒng)的事件綁定

內(nèi)聯(lián)模型

基本上很少用颂暇,維護(hù)起來(lái)簡(jiǎn)直想殺人缺谴。。耳鸯。
下面這兩種形式

    <input value="點(diǎn)擊" id="btn" type="button" onclick="alert('aaa')">
   <input value="點(diǎn)擊" id="btn" type="button" onclick="btnOnclick()">

腳本模型

即用JavaScript獲取DOM設(shè)置事件

傳統(tǒng)事件綁定的問(wèn)題

一湿蛔、多次綁定會(huì)被覆蓋

很直觀的問(wèn)題膀曾,重復(fù)綁定會(huì)覆蓋掉前面的
  /*缺點(diǎn)1:綁定多次會(huì)被覆蓋 */
  window.onload = function(){
    alert("onload 111111");
  }
  window.onload = function(){
    alert("onload 2222222");
  }

二、this的指向問(wèn)題

  var myDiv = document.getElementById("myDiv");
  myDiv.onclick = toBlue;
  function toBlue(){
      alert(this);//第一次就是DivElement   第二次就是window了
      this.className = "blue";
      this.onclick = toRed;
  }
  function toRed(){
      this.className = "red";
      this.onclick = function(){
            toBlue();
      }
  }

三阳啥、too much recursion的問(wèn)題

當(dāng)你不停的add事件時(shí)添谊,可能會(huì)報(bào)出too much recursion的錯(cuò)誤,這是因?yàn)槟惴e累了太多的保存事件察迟,太多遞歸導(dǎo)致瀏覽器卡死斩狱。
解決方法:用完的事件,立即處理掉

        var myDiv = document.getElementById("myDiv");
        //可以通過(guò)[]的形式獲取綁定事件
        myDiv['onclick'] = function(){
            alert("aaa");
        };

        /**
         *  obj : 要移出的元素
         *  type: 要移出的事件類型 click等
         **/
        function removeEvent(obj,type){
            if(obj['on'+type]) obj['on'+type] = null;
        }

W3C事件處理

DOM2級(jí)中扎瓶,定義了addEventListener和removeEventListener方法所踊。最后一個(gè)參數(shù) true:表示捕獲,false:表示冒泡

一概荷,解決了this的指向問(wèn)題秕岛,再也不怕too much recursion了

我們將上面this指向的代碼稍微修改一下
            var myDiv = document.getElementById("myDiv");

            myDiv.addEventListener('click',toBlue);
            function toBlue(){
                alert(this);//都是DivElement
                this.className = "blue";
                this.addEventListener('click',toRed);
            }
            function toRed(){
                this.className = "red";
                myDiv.addEventListener('click',function(){
                    toBlue();
                });
            }

二,解決重復(fù)綁定覆蓋的問(wèn)題

 var myDiv = document.getElementById("myDiv");
 myDiv.addEventListener('click',function(){
     alert("event 11111");
 })
 /**
 * 不再覆蓋,兩個(gè)都會(huì)執(zhí)行,共存
 * */
 myDiv.addEventListener('click',function(){
     alert("event 222222");
 })

IE的事件處理函數(shù)

IE9就全面支持W3C的事件函數(shù)了乍赫,這里就做個(gè)簡(jiǎn)單的了解

提供了兩個(gè)方法:
attachEvent()
detachEvent()

幾個(gè)不同點(diǎn)

1,IE不支持捕獲瓣蛀,只支持冒泡
2,IE不能屏蔽重復(fù)的函數(shù)
3雷厂,IE中this指向的是window對(duì)象
4惋增,之前說(shuō)到,IE在傳統(tǒng)事件中接收不到event事件對(duì)象的
但是attchEvent可以做到改鲫。诈皿。。真是讓人爪機(jī)

不想裝個(gè)IE瀏覽器像棘,這就不測(cè)試了稽亏,做個(gè)簡(jiǎn)單的記錄,方便以后用到的時(shí)候查詢

添加/刪除事件缕题,得到事件對(duì)象的兼容代碼

    //添加事件兼容
    function addEvent(obj, type, fn) {
        if (obj.addEventListener) {
            obj.addEventListener(type, fn);
        } else
                if (obj.attachEvent) {
                   obj.attachEvent('on' + type, fn); }
    }

    //移除事件兼容
    function removeEvent(obj, type, fn) {
        if (obj.removeEventListener) {
            obj.removeEventListener(type, fn);
        } else if (obj.detachEvent) {
             obj.detachEvent('on' + type, fn);
        }
    }
    //得到事件目標(biāo)
    function getTarget(evt) { if (evt.target) {
        return evt.target;
    } else if (window.event.srcElement) {
        return window.event.srcElement; }
    }

事件其他補(bǔ)充(主要是兼容方面)

獲取移入和移出的DOM對(duì)象的兼容問(wèn)題

 W3C版:事件對(duì)象屬性:relatedTarget
 IE版:fromElement 和 toElement,分別對(duì)應(yīng) mouseover 和 mouseout截歉。

不同的實(shí)現(xiàn),又需要兼容的代碼~

 function getTarget(evt) {
        var e = evt || window.event;
        if (e.srcElement) {//如果支持,就是IE瀏覽器(srcElement:事件目標(biāo))
            if (e.type == 'mouseover') {
                return e.fromElement;
            } else if (e.type == 'mouseout') {
                return e.toElement;}
        } else if (e.relatedTarget) {
            //如果支持 relatedTarget,表示 W3C ;
            return e.relatedTarget;
        }
    }

取消事件默認(rèn)行為的兼容性問(wèn)題

場(chǎng)景:取消超鏈接的默認(rèn)行為.

解決方法一:
設(shè)置 return false烟零。
缺點(diǎn):
1)瘪松、必須寫在最后,那么中間的代碼執(zhí)行后锨阿,
可能執(zhí)行不到return false;(例如中間報(bào)錯(cuò)了宵睦,但是頁(yè)面依舊會(huì)跳轉(zhuǎn))
2)、如果寫在最前面墅诡,那么就無(wú)法做一些跳轉(zhuǎn)判斷了(通過(guò)一段邏輯判斷后才決定是否跳轉(zhuǎn))
` <a id="aLink" >aaaa</a>`
    var aLink = document.getElementById("aLink");
    aLink.onclick = function(){
        /**
         *
         * */
        var person = function(){

        }
        var p = new Person();
        p.show();//這里沒(méi)有show方法,報(bào)錯(cuò)了,所以后面的return false沒(méi)有執(zhí)行到,頁(yè)面依舊跳轉(zhuǎn)了
        return false;
    }
解決方法二:取消事件的默認(rèn)行為

W3C:event.preventDefault(); IE:window.event.returnValue = false;

頭疼壳嚎,又需要兼容。。烟馅。

兼容代碼
    function preDef(event) {
        var e = event || window.event;
        if(e.preventDefault) {
            e.preventDefault();
        }else {
            e.returnValue= false;
        }
    }

oncontextmenu事件

可用于取消右鍵事件说庭,提升瀏覽器性能

    window.document.oncontextmenu = function(event){
        var e = event || window.event;
        if(e.preventDefault) {
            e.preventDefault();
        }else {
            e.returnValue= false;
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市郑趁,隨后出現(xiàn)的幾起案子口渔,更是在濱河造成了極大的恐慌,老刑警劉巖穿撮,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缺脉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡悦穿,警方通過(guò)查閱死者的電腦和手機(jī)攻礼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)栗柒,“玉大人礁扮,你說(shuō)我怎么就攤上這事∷猜伲” “怎么了太伊?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)逛钻。 經(jīng)常有香客問(wèn)我僚焦,道長(zhǎng),這世上最難降的妖魔是什么曙痘? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任芳悲,我火速辦了婚禮,結(jié)果婚禮上边坤,老公的妹妹穿的比我還像新娘名扛。我一直安慰自己,他們只是感情好茧痒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布肮韧。 她就那樣靜靜地躺著,像睡著了一般旺订。 火紅的嫁衣襯著肌膚如雪弄企。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天耸峭,我揣著相機(jī)與錄音桩蓉,去河邊找鬼淋纲。 笑死劳闹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播本涕,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼业汰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了菩颖?” 一聲冷哼從身側(cè)響起样漆,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晦闰,沒(méi)想到半個(gè)月后放祟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呻右,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年跪妥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片声滥。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡眉撵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出落塑,到底是詐尸還是另有隱情纽疟,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布憾赁,位于F島的核電站污朽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏龙考。R本人自食惡果不足惜膘壶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望洲愤。 院中可真熱鬧颓芭,春花似錦、人聲如沸柬赐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肛宋。三九已至州藕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酝陈,已是汗流浹背床玻。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沉帮,地道東北人锈死。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓贫堰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親待牵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子其屏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 以下文章為轉(zhuǎn)載,對(duì)理解JavaScript中的事件處理機(jī)制很有幫助缨该,淺顯易懂偎行,特分享于此。 什么是事件贰拿? 事件(E...
    jxyjxy閱讀 3,028評(píng)論 1 10
  • 有關(guān)jQuery 事件模塊結(jié)構(gòu)部分的分析可以參考這篇文章蛤袒,作者分析的很不錯(cuò),贊一個(gè)膨更。 進(jìn)題之前汗盘,有幾個(gè)名詞 Eve...
    江楓閱讀 1,449評(píng)論 1 13
  • 聲明:本文來(lái)源于http://www.webzsky.com/?p=731我只是在這里作為自己的學(xué)習(xí)筆記整理一下(...
    angryyan閱讀 6,971評(píng)論 1 6
  • JavaScript 程序采用了異步事件驅(qū)動(dòng)編程模型。在這種程序設(shè)計(jì)風(fēng)格下询一,當(dāng)文檔隐孽、瀏覽器、元素或與之相關(guān)的對(duì)象發(fā)...
    劼哥stone閱讀 1,252評(píng)論 3 11
  • 上海是個(gè)神奇的城市健蕊,她不問(wèn)你的出生菱阵,學(xué)歷,不會(huì)鄙視你家庭條件缩功,她只看你是否努力晴及,真的。
    徐利奧小朋友的心情閱讀 259評(píng)論 0 1