22. 事件

1. DOM0 事件和DOM2級在事件監(jiān)聽使用方式上有什么區(qū)別押袍?

  • 添加方式
    • DOM0級事件是通過內(nèi)聯(lián)方式<div onclick="console.log()">...</div>或是在JS中寫onclick=function( ){ }函數(shù)進(jìn)行添加
    • DOM2級事件通過addEventListener來添加事件監(jiān)聽联四,接受三個參數(shù):事件類型、事件處理方法仑濒、布爾值(true表示事件捕獲階段響應(yīng)叹话,false表示事件冒泡階段響應(yīng),默認(rèn)false)墩瞳。例:btn.addEventListener('onclick',function( ){ },false)
  • 刪除事件
    • 刪除DOM0級方法制定的事件處理程序驼壶,將事件處理程序的值設(shè)置為null即可:btn.onclick=null
    • 刪除DOM2級方法制定的事件處理程序:removeEventListener
      但是該方法不能移除addEventListener添加的匿名函數(shù)
btn.addEventListener('click',function(){console.log('hello')},false);
btn.removeEventListener('click',function(){console.log('hello')},false);//沒有效果
//使用這樣的寫法才行
function handle(){
  console.log('hello')
}
var btn=document.querySelector('#btn');
btn.addEventListener('click',handle,false);
btn.removeEventListener('click',handle,false)
  • 多個事件處理程序:DOM0不支持多個事件處理程序,后面的會覆蓋前面的喉酌,只能一個事件處理程序?qū)?yīng)一個函數(shù)热凹;DOM2級事件處理程序可以添加多個事件。
  • this:DOM0級事件中this對象指向全局對象瞭吃;DOM2級事件this指向Element節(jié)點
  • DOM0級事件只能在冒泡階段進(jìn)行監(jiān)聽器觸發(fā)碌嘀;DOM2級事件可以通過參數(shù)選擇在冒泡階段或是捕獲階段進(jìn)行監(jiān)聽觸發(fā)
  • 兼容性:DOM0級事件支持所有瀏覽器;DOM2級事件要求瀏覽器為IE8以上

2. attachEvent與addEventListener的區(qū)別

  • 瀏覽器支持情況不同
    IE9以下的瀏覽器不支持addEventListener
  • 參數(shù)個數(shù)不同
    addEventListener有三個參數(shù):type,handle,(true/false)
    attachEvent只要兩個參數(shù):type,handle
    因為attachEvent監(jiān)聽的事件只能發(fā)生在冒泡階段歪架,所以為了兼容性股冗,addEventListener的第三個參數(shù)默認(rèn)為false
  • 第一個參數(shù)不同
    addEventListener的第一個參數(shù)是方法,如click,scroll
    attachEvent第一個參數(shù)是事件名稱和蚪,如onclick,onscroll
  • 事件處理程序的作用域不同
    DOM2級事件中止状,addEventListener作用域在所屬的元素內(nèi)進(jìn)行,此時this指向這個元素
    使用attach方式時攒霹,事件處理程序在全局作用域進(jìn)行怯疤,此時this指向window
  • 執(zhí)行順序不同
    addEventListener會按照添加順序執(zhí)行
    attachEvent添加多個時間處理程序時順序無規(guī)律(在IE9以下,添加方法較少時催束,各方法按添加順序的反順序進(jìn)行集峦,添加方法多時則亂序進(jìn)行)

3. 解釋IE事件冒泡和DOM2事件傳播機制

  • IE事件冒泡
    傳播順序是由里到外,即時間開始時由最具體的元素抠刺,文檔中嵌套最深的那個節(jié)點接收塔淤,然后逐級向上傳播到window(document)


    事件冒泡.png
  • DOM2事件傳播機制
    分為三個階段:
    • 事件捕獲階段。即由最頂層元素(一般是從window元素開始速妖,有的瀏覽器是從document開始)開始高蜂,逐次進(jìn)入dom內(nèi)部,最后到達(dá)目標(biāo)元素罕容,依次執(zhí)行綁定在其上的事件
    • 處于目標(biāo)階段备恤。檢測機制到達(dá)目標(biāo)元素稿饰,按事件注冊順序執(zhí)行綁定在目標(biāo)元素上的事件
    • 時間冒泡階段。從目標(biāo)元素出發(fā)露泊,向外層元素冒泡喉镰,最后到達(dá)頂層(window或者document),依次執(zhí)行綁定在其上的事件


      DOM2級事件.png

4. 如何阻止事件冒泡惭笑?如何阻止默認(rèn)事件

//阻止冒泡
function stopPropagation(e){
    if (e&&e.stopPropagation){
        e.stopPropagation();//W3C標(biāo)準(zhǔn)
    }else{
        window.event.cancelBubble=true;//IE瀏覽器
    }
}

//阻止默認(rèn)事件
function preventDefault(e){
    if (e&&e.preventDefault){
        e.preventDefault()://W3C標(biāo)準(zhǔn)
    }else{
        window.event.returnValue=false;//IE瀏覽器
    }
}

5. 有如下代碼梧喷,要求當(dāng)點擊每一個元素li時控制臺展示該元素的文本內(nèi)容。不考慮兼容

3.png
var ct=document.querySelector('.ct');
ct.addEventListener('click',function(e){
    if(e.target.tagName.toLowerCase()==='li'){
        console.log(e.target.innerText)
    }
})

6. 補全代碼

要求:

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


    4.png
<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>
    function $(node) {
        return document.querySelector(node);
    }
    var ct = $('.ct');
    var ipt = $('.ipt-add-content');
    var btnstart = $('#btn-add-start');
    var btnend = $('#btn-add-end');
    ct.addEventListener('click', function (e) {
        if (e.target.tagName.toLowerCase() === 'li') {
            console.log(e.target.innerText);
        }
    });
    btnstart.addEventListener('click', function () {
        var newNode = document.createElement('li');
        if (ipt.value.length !== 0) {
            newNode.innerText = ipt.value;
            ct.insertBefore(newNode, ct.firstChild);
        }
    });
    btnend.addEventListener('click', function () {
        var newNode = document.createElement('li');
        if (ipt.value.length !== 0) {
            newNode.innerText = ipt.value;
            ct.appendChild(newNode);
        }
    });
</script> 
</script> 

7. 補全代碼

要求:當(dāng)鼠標(biāo)放置在li元素上屁擅,會在img-preview里展示當(dāng)前l(fā)i元素的data-img對應(yīng)的圖片偿凭。

<ul class="ct">
    <li data-img="http://cdn.jirengu.com/book.jirengu.com/img/11.jpg">鼠標(biāo)放置查看圖片1</li>
    <li data-img="http://cdn.jirengu.com/book.jirengu.com/img/12.jpg">鼠標(biāo)放置查看圖片2</li>
    <li data-img="http://cdn.jirengu.com/book.jirengu.com/img/13.jpg">鼠標(biāo)放置查看圖片3</li>
</ul>
<div class="img-preview"></div>
<script>
    function $(node){
        return document.querySelector(node);
    }
    var ct=$('.ct');
    var preview=$('.img-preview');
    var newImg=document.createElement('img');
    ct.addEventListener('mouseover',function(e){
        if(e.target.tagName.toLowerCase()==='li'){
            newImg.src=e.target.getAttribute('data-img');
            preview.appendChild(newImg);
        }
    });
</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市派歌,隨后出現(xiàn)的幾起案子弯囊,更是在濱河造成了極大的恐慌,老刑警劉巖胶果,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匾嘱,死亡現(xiàn)場離奇詭異,居然都是意外死亡早抠,警方通過查閱死者的電腦和手機霎烙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕊连,“玉大人悬垃,你說我怎么就攤上這事「什裕” “怎么了尝蠕?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長载庭。 經(jīng)常有香客問我看彼,道長,這世上最難降的妖魔是什么囚聚? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任靖榕,我火速辦了婚禮,結(jié)果婚禮上靡挥,老公的妹妹穿的比我還像新娘序矩。我一直安慰自己鸯绿,他們只是感情好跋破,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布簸淀。 她就那樣靜靜地躺著,像睡著了一般毒返。 火紅的嫁衣襯著肌膚如雪租幕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天拧簸,我揣著相機與錄音劲绪,去河邊找鬼。 笑死盆赤,一個胖子當(dāng)著我的面吹牛贾富,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播牺六,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼颤枪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了淑际?” 一聲冷哼從身側(cè)響起畏纲,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎春缕,沒想到半個月后盗胀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡锄贼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年票灰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宅荤。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡米间,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膘侮,到底是詐尸還是另有隱情屈糊,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布琼了,位于F島的核電站逻锐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏雕薪。R本人自食惡果不足惜昧诱,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望所袁。 院中可真熱鬧盏档,春花似錦、人聲如沸燥爷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至稚配,卻和暖如春畅涂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背道川。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工午衰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冒萄。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓臊岸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尊流。 傳聞我的和親對象是個殘疾皇子扇单,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

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

  • JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的。事件奠旺,就是文檔或瀏覽器窗口中發(fā)生的一些特定的交互瞬...
    threetowns閱讀 339評論 0 0
  • 聲明:本文來源于http://www.webzsky.com/?p=731我只是在這里作為自己的學(xué)習(xí)筆記整理一下(...
    angryyan閱讀 6,951評論 1 6
  • 一响疚、問答 1. dom對象的innerText和innerHTML有什么區(qū)別鄙信? innerHTML: 也就是從對象...
    饑人谷_羅偉恩閱讀 586評論 0 2
  • 如何批量操作 css 如何獲取 DOM 計算后的樣式 使用getComputedStyle獲取元素計算后的樣式 實...
    _Dot912閱讀 552評論 1 3
  • 1:DOM0事件和DOM2級在事件監(jiān)聽使用方式上有什么區(qū)別? 瀏覽器端的JavaScript采用的是事件驅(qū)動的異步...
    饑人谷_bigJiao閱讀 276評論 0 0