JS—事件處理程序

  • 簡單理解
    事件是用戶或?yàn)g覽器自身執(zhí)行的某種動(dòng)作棉饶。諸如click需了、load
    而事件處理程序則是響應(yīng)某個(gè)事件的函數(shù)。諸如onclick、onload
    也就是當(dāng)用戶與頁面上某個(gè)元素進(jìn)行某種交互(click)時(shí)机蔗,會(huì)執(zhí)行事件處理程序內(nèi)(onclick)的函數(shù)。如果沒有為這個(gè)元素設(shè)立事件處理程序酸员,那么用戶與該元素進(jìn)行的交互不會(huì)有反應(yīng)蜒车。
  • 事件處理程序
  • event、this
    這個(gè)函數(shù)中有一個(gè)局部變量event幔嗦、也就是事件對(duì)象酿愧,不用自己去定義,也不用從函數(shù)的參數(shù)列表中讀取邀泉。
    this值等于事件的目標(biāo)元素嬉挡。
  • HTML事件處理程序
    <form action="">
    <input onclick="alert(value)" type="button" name="btn" value="點(diǎn)我一下!" />
    <input ondblclick="alert(value)" type="button" name="btn" value="點(diǎn)我兩下汇恤!" />
    </form>
上:單擊庞钢,下:雙擊
    • 【優(yōu)點(diǎn)】擴(kuò)展作用域,我們可以直接在onclick的屬性值中使用其他屬性因谎。alert(value)
  • 【缺點(diǎn)】1基括、存在一個(gè)時(shí)差問題,用戶可能會(huì)在html元素一出現(xiàn)就觸發(fā)相應(yīng)的事件财岔,但是該事件處理程序可能在js腳本內(nèi)风皿,還沒有被解析,就會(huì)發(fā)生錯(cuò)誤匠璧。2桐款、擴(kuò)展事件的處理程序的作用域鏈在不同瀏覽器中會(huì)導(dǎo)致不同的結(jié)果
    3、HTML代碼與JS腳本代碼緊密耦合夷恍。
  • DOM0級(jí)事件處理程序
    js指定事件處理程序魔眨,將一個(gè)函數(shù)賦值給一個(gè)元素的事件處理程序的屬性。
    <input type="button" name="btn" id="d1" value="點(diǎn)我一下酿雪!" />
    //第一步:獲得目標(biāo)元素
    var btn=document.getElementById("d1");
    //第二步:為元素的事件處理程序?qū)傩再x值
    btn.onclick=function(){
    alert(this.value);
    }
    btn.onclick=null;//將對(duì)匿名函數(shù)的引用變?yōu)?遏暴,從而刪除。
    程序中的this引用當(dāng)前元素指黎,可以通過this訪問元素的任何屬性和方法朋凉。
    • 【優(yōu)點(diǎn)】
      1、簡單
      2袋励、具有跨瀏覽器的優(yōu)勢(shì)
    • 【缺點(diǎn)】
      1、如果代碼位于按鈕后面,就有可能一段時(shí)間內(nèi)怎么單擊都沒有反應(yīng)茬故。
      2盖灸、為一個(gè)元素添加多個(gè)相同事件處理程序前者會(huì)被后者覆蓋。
  • DOM2級(jí)事件處理程序
    定義了兩個(gè)方法磺芭,用于處理指定和用于刪除事件處理程序的操作赁炎。
    addEventListener() removeEventListener()
    這兩個(gè)方法都接受三個(gè)參數(shù):要處理的事件名,作為事件處理程序的函數(shù)钾腺,和一個(gè)布爾值徙垫。布爾值為true表示在捕獲階段調(diào)用時(shí)間處理程序,為false表示在冒泡階段調(diào)用放棒。
    //第一步:獲得目標(biāo)元素
    var btn=document.getElementById("d1");
    //第二步:指定事件處理程序
    btn.addEventListener('click',function(){
    alert(this.value);
    },false);
    btn.addEventListener('click',function(){
    alert(this.id);
    },false);
    上述代碼中姻报,為click事件制定了兩個(gè)事件處理程序,結(jié)果分別按聲明順序執(zhí)行间螟。
    【注意】移除時(shí)吴旋,如果只把方法名替換了,課達(dá)不到刪除的效果厢破,因?yàn)槲覀冊(cè)谥付ㄊ录幚沓绦驎r(shí)使用的是匿名函數(shù)荣瑟,每次聲明一個(gè)匿名函數(shù)即使代碼一樣,但是卻是不同的對(duì)象摩泪。所以我們需要聲明一個(gè)變量笆焰,讓他引用這個(gè)匿名函數(shù)。然后通過這個(gè)引用來刪除對(duì)原來匿名函數(shù)的刪除见坑。
    var handler=function(){
    alert(this.value);
    };
    btn.addEventListener('click',handler,false);
    //移除
    btn.removeEventListener('click',handler,false)

寫完這段筆記后嚷掠,我想可不可以在html指定事件處理程序時(shí),使用函數(shù)的方式鳄梅。后來我試了一下叠国。
<input onclick="handler" type="button" value="點(diǎn)我一下!"/>
error:不能使用引用戴尸,需要一段執(zhí)行代碼粟焊。
<input onclick="handler()" type="button" value="點(diǎn)我一下!" />
error:彈出警告框孙蒙,為undefined项棠。
function handler(){
alert(this);
};
測試:[object window]說明該this并沒有指向目標(biāo)元素。
為什么呢挎峦?
<input onclick="alert(value)" type="button" id="d1" value="點(diǎn)我一下香追!" />
當(dāng)我們這樣寫的時(shí)候,"alert(value)"這行代碼被自動(dòng)加到這樣的函數(shù)內(nèi):
with(document){
with(this){
//元素屬性值
}
}
知道了這個(gè)原理坦胶,我們可能會(huì)覺得那么在handler函數(shù)里面補(bǔ)上不就可以啦透典,事實(shí)上也是不行的晴楔,因?yàn)槲覀兲砑拥暮瘮?shù)的his值并不會(huì)指向元素

  • IE事件處理程序
    在IE9以前包括IE9的瀏覽器都支持DOM2級(jí)事件處理程序,IE8是最后一個(gè)仍然使用其專有事件系統(tǒng)的主要瀏覽器峭咒。
    而IE8及更早版本只支持事件冒泡税弃,所以在指定事件處理程序時(shí),就可以不指定采用怎么樣的事件流機(jī)制啦凑队。
    他也是通過兩個(gè)方法實(shí)現(xiàn)指定與移除事件處理程序的则果,移除時(shí),也是需要先將處理程序函數(shù)賦值給一個(gè)變量漩氨。
    //第一步:獲得目標(biāo)元素
    var btn=document.getElementById('d1');
    //第二步:指定事件處理程序
    function handler(){
    alert('clicked');
    };
    btn.attachEvent("onclick",handler);
    btn.detachEvent('onclick',handler);
    但總是有區(qū)別的:
    區(qū)別1:事件處理程序的作用域不是在所屬元素西壮,而是全局對(duì)象。
    區(qū)別2:為一個(gè)元素指定多個(gè)事件處理程序時(shí)叫惊,事件處理程序的執(zhí)行函數(shù)與dom2級(jí)相反款青。即與聲明順序相反。

  • 跨瀏覽器的事件處理程序
    var EventUtil={
    addHandler:function(element,type,handler){
    if(element.addEventListener){
    element.addEventListener(type,handler,false);
    }else if(element.attachEvent){
    element.attachEvent("on"+type,handler);
    }else{
    element["on"+type]=handler;
    }

          },
          removeHandler:function(element,type,handler){
              if(element.removeEventListener){
                  element.removeEventListener(type,handler,false);
              }else if(element.detachEvent){
                  element.detachEvent("on"+type,handler);
              }else{
                  element["on"+type]=null;
              }
          }
      }
      var btn=document.getElementById('d1');
      function handler(){
          alert('clicked');
      };
      EventUtil.addHandler(btn,'click',handler);
      EventUtil.removeHandler(btn,"click",handler);
    
  • 因?yàn)槌ゾW(wǎng)景赋访,大多數(shù)瀏覽器都是支持冒泡的事件流的可都,所以在設(shè)計(jì)跨瀏覽器代碼時(shí),只需要關(guān)注冒泡階段蚓耽。

  • 解決方法是渠牲,創(chuàng)建對(duì)象,并在對(duì)象內(nèi)調(diào)用方法步悠,這樣可以起到一定的封裝作用签杈。

  • 針對(duì):DOM0級(jí),DOM2級(jí)鼎兽,IE方法答姥。三種情況。

  • 順序:普遍優(yōu)先谚咬。

  • 不足:代碼中沒有針對(duì)this作用域的區(qū)別加以

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鹦付,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子择卦,更是在濱河造成了極大的恐慌敲长,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秉继,死亡現(xiàn)場離奇詭異祈噪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)尚辑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門辑鲤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人杠茬,你說我怎么就攤上這事月褥〕谒妫” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵宁赤,是天一觀的道長撵幽。 經(jīng)常有香客問我,道長礁击,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任逗载,我火速辦了婚禮哆窿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厉斟。我一直安慰自己挚躯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布擦秽。 她就那樣靜靜地躺著码荔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪感挥。 梳的紋絲不亂的頭發(fā)上缩搅,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音触幼,去河邊找鬼硼瓣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛置谦,可吹牛的內(nèi)容都是我干的堂鲤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼媒峡,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼瘟栖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谅阿,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤半哟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后奔穿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镜沽,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年贱田,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缅茉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡男摧,死狀恐怖蔬墩,靈堂內(nèi)的尸體忽然破棺而出译打,到底是詐尸還是另有隱情,我是刑警寧澤拇颅,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布奏司,位于F島的核電站,受9級(jí)特大地震影響樟插,放射性物質(zhì)發(fā)生泄漏韵洋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一黄锤、第九天 我趴在偏房一處隱蔽的房頂上張望搪缨。 院中可真熱鬧,春花似錦鸵熟、人聲如沸副编。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痹届。三九已至,卻和暖如春打月,著一層夾襖步出監(jiān)牢的瞬間队腐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工奏篙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留香到,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓报破,卻偏偏與公主長得像悠就,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子充易,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • 聲明:本文來源于http://www.webzsky.com/?p=731我只是在這里作為自己的學(xué)習(xí)筆記整理一下(...
    angryyan閱讀 7,010評(píng)論 1 6
  • 事件流: 事件流:頁面接收事件的順序梗脾。 IE定義的:事件冒泡流(由最具體的元素依次傳播到DOM樹的最上層的Docu...
    xiaoguo16閱讀 589評(píng)論 0 0
  • 使用DOM0級(jí)方法指定的事件處理程序被認(rèn)為是元素的方法。因此盹靴,這時(shí)候的事件處理程序是在元素的作用域中運(yùn)行炸茧;換句話說...
    shirleyyu001閱讀 1,165評(píng)論 0 0
  • DOM0級(jí)事件處理程序 在標(biāo)簽內(nèi)之間增加事件處理屬性 使用該方法有兩個(gè)弊端:1、 需要分別為標(biāo)簽賦予onclick...
    Mescal川閱讀 376評(píng)論 0 0
  • 從醉生出來的第一個(gè)半年稿静。我在這金陵城中梭冠,天子腳下土,三層樓閣中改备。金陵城的夜晚燈火通明照亮這半邊天控漠,我倚在美人靠上,...
    山茶茶茶荼閱讀 318評(píng)論 0 0