事件

題目1: DOM0 事件和DOM2級(jí)在事件監(jiān)聽使用方式上有什么區(qū)別贸营?

事件處理程序

我們也稱之為事件偵聽器(listener)岩睁,事件就是用戶或?yàn)g覽器自身執(zhí)行的某種動(dòng)作。比如click冰啃、load、mouseover等焚刚,都是事件類型(俗稱事件名稱)扇调,而響應(yīng)某個(gè)事件的方法就叫做事件處理程序或者事件監(jiān)聽器

  • DOM0級(jí)事件處理程序
    在DOM0級(jí)事件處理程序狼钮,事件名以'on'開頭,因此click事件的事件處理程序就是onclick莲镣、load事件的事件處理程序就是onload涎拉。
    HTML事件處理程序
    一個(gè)HTML元素支持事件,可以通過HTML元素的屬性來指定:
    <input type="button" value="這是個(gè)按鈕" onclick="showMessage()" >
    上面的input對(duì)應(yīng)的onclick事件處理程序如下:
    function showMessage(){
        alert('itbilu.com');
    }
    
    上面通過HTML元素屬性添加事件處理程序的方式半火,屬于DOM0事件處理程序慈缔。通過上面的方式添加會(huì)有一定的麻煩种玛,HTML與JavaScript代碼緊密耦合,對(duì)代碼修改和維護(hù)都造成了不便娱节。
    通過JavaScript添加DOM0事件處理程序
    要使用JavaScript指定事件處理程序祭示,首先要獲得一個(gè)要操作的對(duì)象的引用质涛,然后通過其事件處理程序?qū)傩裕ㄟ@些屬性通常全部小寫,例如:onclick)怒炸,指定事件處理程序毡代。
    var btn = document.getElementById("myBtn");
    btn.onclick = function(){
        alert('itbilu.com');
    }
    
    DOM0級(jí)事件處理程序可以認(rèn)為是元素的方法。刪除DOM0級(jí)事件處理程序捏鱼,將相應(yīng)屬性值設(shè)置為null即可导梆。
    btn.onclick = null;
  • DOM2級(jí)事件處理程序
    在W3C制定的DOM2規(guī)范中,其中的DOM 事件規(guī)范定義了兩個(gè)方法:addEventListener()和removeEventListener()猿诸,分別用于添加事件處理程序和刪除事件處理程序狡忙。
    var btn = document.getElementById("myBtn");
    btn.addEventListener("click", showMessage, false);
    
    所有的DOM節(jié)點(diǎn)都包含這兩個(gè)方法址芯,并且它們都接受三個(gè)參數(shù):事件類型谷炸、事件處理方法、布爾參數(shù)(如果是true表示在捕獲階段調(diào)用事件處理程序拓颓,如果是false描孟,則是在事件冒泡階段處理)匿醒。
    使用DOM2級(jí)方法添加事件處理程序時(shí),可以為指定元素添加多個(gè)事件處理程序溉痢。
    var btn = document.getElementById("myBtn");
    btn.addEventListener("click", showMessage, false);
    btn.addEventListener("click", showMessage2, false);
    
    刪除DOM2級(jí)事件處理程序方法如下:
    btn.removeEventListener("click", showMessage, false);
    

    attachEvent()與detachEvent()
    在早期的IE瀏覽器憋他,如:IE8中竹挡,沒有實(shí)現(xiàn)addEventListener()和removeEventListener(),但提供了兩個(gè)替代方法attachEvent()和detachEvent()汽畴。由于Microsoft當(dāng)前最新的系統(tǒng)Windows 10中,已放棄IE被edge瀏覽器替代鲁猩,所在attachEvent()和detachEvent()已沒有意義罢坝。

題目2: attachEvent與addEventListener的區(qū)別嘁酿?

  • 參數(shù)個(gè)數(shù)不相同

    addEventListener有三個(gè)參數(shù),attachEvent只有兩個(gè)娱仔,attachEvent添加的事件處理程序只能發(fā)生在冒泡階段游桩,addEventListener第三個(gè)參數(shù)可以決定添加的事件處理程序是在捕獲階段還是冒泡階段處理(我們一般為了瀏覽器兼容性都設(shè)置為冒泡階段)

  • 第一個(gè)參數(shù)意義不同

    addEventListener第一個(gè)參數(shù)是事件類型(比如click借卧,load),而attachEvent第一個(gè)參數(shù)指明的是事件處理函數(shù)名稱(onclick陪每,onload)

  • 事件處理程序的作用域不相同

    addEventListener的作用域是元素本身镰吵,this是指的觸發(fā)元素,而attachEvent事件處理程序會(huì)在全局變量?jī)?nèi)運(yùn)行锌订,this是window辆飘,所以剛才例子才會(huì)返回undefined谓传,而不是元素id

  • 為一個(gè)事件添加多個(gè)事件處理程序時(shí),執(zhí)行順序不同

    addEventListener添加會(huì)按照添加順序執(zhí)行紧卒,而attachEvent添加多個(gè)事件處理程序時(shí)順序無規(guī)律(添加的方法少的時(shí)候大多是按添加順序的反順序執(zhí)行的跑芳,但是添加的多了就無規(guī)律了),所以添加多個(gè)的時(shí)候怀樟,不依賴執(zhí)行順序的還好盆佣,若是依賴于函數(shù)執(zhí)行順序共耍,最好自己處理,不要指望瀏覽器

題目3: 解釋IE事件冒泡和DOM2事件傳播機(jī)制穆咐?

  • IE事件冒泡

    如下圖佃蚜,對(duì)一個(gè)例如div這樣的子容器進(jìn)行事件監(jiān)聽谐算,IE的傳播機(jī)制是從事件目標(biāo)節(jié)點(diǎn)逐步的向上層結(jié)點(diǎn)傳播归露,直到到達(dá)根結(jié)點(diǎn)


    IE事件冒泡模型
  • DOM2事件流

    如下圖剧包,對(duì)一個(gè)例如這樣的子容器進(jìn)行事件監(jiān)聽,DOM2的傳播機(jī)制是先從頂層根結(jié)點(diǎn)開始一級(jí)一級(jí)向下傳播一铅,直到傳到目標(biāo)節(jié)點(diǎn)堕油,這一階段叫做事件捕獲掉缺;最后事件從目標(biāo)節(jié)點(diǎn)一級(jí)一級(jí)向頂層根結(jié)點(diǎn)傳播,這一階段叫做事件冒泡艰毒。DOM2事件流是事件冒泡和事件捕獲的結(jié)合搜囱。


    DOM2事件流模型

題目4:如何阻止事件冒泡? 如何阻止默認(rèn)事件冰单?

阻止事件冒泡可以使用DOM中的事件對(duì)象的方法:stopPropagation()

stopPropagation()方法可以停止事件在DOM層次的傳播诫欠,即取消進(jìn)一步的事件捕獲或冒泡浴栽。我們可以在button的事件處理程序中調(diào)用stopPropagation()從而避免注冊(cè)在body上的事件發(fā)生

var handler = function (e) {
   alert(e.type);
   e.stopPropagation();
}
addEvent(document.body, 'click', function () { alert('Clicked body')});
var btnClick = document.getElementById('btnClick');
addEvent(btnClick, 'click', handler);

阻止默認(rèn)事件可以使用DOM中事件對(duì)象的方法:preventDefault()典鸡,前提是cancelable值為true,比如我們可以阻止鏈接導(dǎo)航這一默認(rèn)行為

document.querySelector('#btn').onclick = function (e) {
   e.preventDefault();
}

對(duì)于IE瀏覽器嫁乘,阻止事件冒泡可以使用event對(duì)象的方法:cancelBubble()球碉,默認(rèn)為false睁冬,設(shè)置為true后可以取消事件冒泡;在IE瀏覽器下阻止默認(rèn)事件可以使用:returnValue()直奋,默認(rèn)為true脚线,設(shè)為false可以取消事件默認(rèn)行為弥搞。

題目5:有如下代碼,要求當(dāng)點(diǎn)擊每一個(gè)元素li時(shí)控制臺(tái)展示該元素的文本內(nèi)容斯碌。不考慮兼容

<ul class="ct">
    <li>這里是</li>
    <li>饑人谷</li>
    <li>前端6班</li>
</ul>
<script>
//todo ...
    var ct = document.querySelector('.ct');
    ct.addEventListener('click', function(e){
    console.log(e.target.innerText);
  });
</script>

題目6: 補(bǔ)全代碼傻唾,要求:

當(dāng)點(diǎn)擊按鈕開頭添加時(shí)在<li>這里是</li>元素前添加一個(gè)新元素,內(nèi)容為用戶輸入的非空字符串伪煤;當(dāng)點(diǎn)擊結(jié)尾添加時(shí)在最后一個(gè) li 元素后添加用戶輸入的非空字符串.
當(dāng)點(diǎn)擊每一個(gè)元素li時(shí)控制臺(tái)展示該元素的文本內(nèi)容凛辣。

<ul class="ct">
    <li>這里是</li>
    <li>饑人谷</li>
    <li>任務(wù)班</li>
</ul>
<input class="ipt-add-content" placeholder="添加內(nèi)容"/>
<button id="btn-add-start">開頭添加</button>
<button id="btn-add-end">結(jié)尾添加</button>
<script>
//你的代碼
  var ct = document.querySelector('.ct'),
      addStartBtn = document.querySelector('#btn-add-start'),
      addEndBtn = document.querySelector('#btn-add-end'),
      ipt = document.querySelector('.ipt-add-content');
  
  ct.addEventListener('click', function(e){
      if(e.target.tagName.toLowerCase() === 'li'){
       console.log(e.target.innerText);
      }
  });
  
  addStartBtn.addEventListener('click', function(){
     if(ipt.value){
       var li = document.createElement('li');
       li.innerText = ipt.value;
        ct.insertBefore(li,ct.firstChild);
     }
  });
  
  addEndBtn.addEventListener('click', function(){
    if(ipt.value){
      var li = document.createElement('li');
      li.innerText = ipt.value;
      ct.appendChild(li);
    }
  })
</script>

題目7: 補(bǔ)全代碼防泵,要求:當(dāng)鼠標(biāo)放置在li元素上蝗敢,會(huì)在img-preview里展示當(dāng)前l(fā)i元素的data-img對(duì)應(yīng)的圖片寿谴。

<ul class="ct">
    <li data-img="1.png">鼠標(biāo)放置查看圖片1</li>
    <li data-img="2.png">鼠標(biāo)放置查看圖片2</li>
    <li data-img="3.png">鼠標(biāo)放置查看圖片3</li>
</ul>
<div class="img-preview"></div>
<script>
//方法一:事件代理把事件綁定到父元素上
  var ct = document.querySelector('.ct'),
      preview = document.querySelector('.img-preview')
  
  ct.addEventListener('mouseover', function(e){
    if(e.target.tagName.toLowerCase() === 'li'){
       var image = document.createElement('img');
       image.src = e.target.dataset.img;
       preview.appendChild(image);
    }
  })
  
    ct.addEventListener('mouseout', function(e){
    if(e.target.tagName.toLowerCase() === 'li'){
      preview.innerHTML = '';
    }
  })
</script>
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末讶泰,一起剝皮案震驚了整個(gè)濱河市咏瑟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痪署,老刑警劉巖码泞,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異惠桃,居然都是意外死亡浦夷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門辜王,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人罐孝,你說我怎么就攤上這事×ぃ” “怎么了汹来?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)改艇。 經(jīng)常有香客問我收班,道長(zhǎng),這世上最難降的妖魔是什么谒兄? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任摔桦,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘邻耕。我一直安慰自己鸥咖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布兄世。 她就那樣靜靜地躺著啼辣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪御滩。 梳的紋絲不亂的頭發(fā)上鸥拧,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音削解,去河邊找鬼富弦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛钠绍,可吹牛的內(nèi)容都是我干的舆声。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼柳爽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼媳握!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起磷脯,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蛾找,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后赵誓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體打毛,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年俩功,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幻枉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诡蜓,死狀恐怖熬甫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蔓罚,我是刑警寧澤椿肩,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站豺谈,受9級(jí)特大地震影響郑象,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茬末,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一厂榛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦噪沙、人聲如沸炼彪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辐马。三九已至,卻和暖如春局义,著一層夾襖步出監(jiān)牢的瞬間喜爷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工萄唇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留檩帐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓另萤,卻偏偏與公主長(zhǎng)得像湃密,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子四敞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • 聲明:本文來源于http://www.webzsky.com/?p=731我只是在這里作為自己的學(xué)習(xí)筆記整理一下(...
    angryyan閱讀 7,011評(píng)論 1 6
  • 一忿危、問答 1. dom對(duì)象的innerText和innerHTML有什么區(qū)別达箍? innerHTML: 也就是從對(duì)象...
    饑人谷_羅偉恩閱讀 597評(píng)論 0 2
  • 1:DOM0事件和DOM2級(jí)在事件監(jiān)聽使用方式上有什么區(qū)別? 瀏覽器端的JavaScript采用的是事件驅(qū)動(dòng)的異步...
    饑人谷_bigJiao閱讀 280評(píng)論 0 0
  • 1.事件代理 事件代理:為子元素添加監(jiān)聽器轉(zhuǎn)變?yōu)闉楦溉萜魈砑颖O(jiān)聽器,然后通過event.target判斷具體操作的...
    IT男的成長(zhǎng)記錄閱讀 523評(píng)論 0 0
  • 一、dom對(duì)象的innerText和innerHTML有什么區(qū)別解滓? innerHTML返回的是從對(duì)象起始位置到終止...
    __Qiao閱讀 413評(píng)論 0 0