JavaScript的DOM事件操作

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

  • DOM0事件有兩種寫入事件
  • 在標簽內(nèi)寫onclick事件
<input type="button" value="Click Here" onclick="alert('Clicked!');" />
  • 將一個函數(shù)賦值給一個事件處理屬性
<input id="btnClick" type="button" value="Click Here" />
<script type="text/javascript">
    var btnClick = document.getElementById('btnClick');
    btnClick.onclick = function showMessage() {
        alert(this.id);
    };
btnClick.onclick = null;  // 刪除事件處理程序畴蒲;
</script>
  • DOM2事件定義了2個方法,用于處理指定和刪除事件處理程序的操作士骤;并且它們都接受三個參數(shù)(事件類型, 事件處理方法, 布爾參數(shù))
  • addEventListener();
<input id="btnClick" type="button" value="Click Here" />
<script type="text/javascript">
    var btnClick = document.getElementById('btnClick');
    btnClick.addEventListener('click', function() {
        alert(this.id);
    }, false);
</script>
  • removeEventListener();
<input id="btnClick" type="button" value="Click Here" />
<script type="text/javascript">
    var btnClick = document.getElementById('btnClick');
    btnClick.removeEventListener('click', function() {
        alert(this.id);
    }, false);
</script>
  • 布爾參數(shù)說明:如果是true表示在捕獲階段調(diào)用事件處理程序,如果是false酗失,則是在事件冒泡階段處理

attachEvent與addEventListener的區(qū)別?

  • attachEvent() 接受2個參數(shù),第一個參數(shù)是事件名稱邮利,第二個參數(shù)是要處理的函數(shù);由于IE8及更早版本只支持事件冒泡垃帅,所以通過attachEvent()添加的事件處理程序會被添加到冒泡階段延届;
  • addEventListener 接受3個參數(shù),第一個參數(shù)是事件名稱贸诚,第二個參數(shù)是要處理的函數(shù)方庭,第三個參數(shù)可以決定添加的事件處理程序是在捕獲階段還是冒泡階段處理;
  • 事件處理程序的作用域不相同酱固,attachEvent事件處理程序會在全局變量內(nèi)運行械念,this => windowaddEventListener的作用域是元素本身运悲,this是指的觸發(fā)元素龄减。
  • 單獨給一個事件添加多個事件處理程序時,執(zhí)行順序不同班眯,attachEvent添加多個事件處理程序時順序無規(guī)律(添加的方法少的時候大多是按添加順序的反順序執(zhí)行的希停,但是添加的多了就無規(guī)律了),addEventListener添加會按照添加順序執(zhí)行署隘。

解釋IE事件冒泡和DOM2事件傳播機制宠能?

  • IE的事件冒泡:事件開始時由最具體的元素接收,然后逐級向上傳播到較為不具體的元素


    IE的事件冒泡
  • DOM2事件流包括三個階段磁餐,事件捕獲階段违崇,處于目標階段,事件冒泡階段诊霹,首先發(fā)生的是事件捕獲羞延,為截取事件提供機會,然后是實際目標接收事件畅哑,最后是冒泡階段


    DOM2事件流

如何阻止事件冒泡肴楷? 如何阻止默認事件水由?

  • 阻止事件冒泡
    • e.stopPropagation()方法可以停止事件在DOM層次的傳播荠呐,即取消進一步的事件捕獲或冒泡
    • IE下使用 e.cancelBubble = true; 默認為false,設置為true后可以取消事件冒泡
  • 阻止默認事件
    • e.preventDefault(); 方法可以阻止默認行為
  • IE下使用 e.returnValue = false; 默認為true砂客,設為false可以取消事件默認行為

實例操作1

  • 要求當點擊每一個元素li時控制臺展示該元素的文本內(nèi)容
<ul class="ct">
    <li>這里是</li>
    <li>饑人谷</li>
    <li>任務班</li>
</ul>
<script>
var ct = document.querySelector('.ct');
ct.addEventListener('click', function(e){
    console.log(e.target.innerText); // 點擊后返回結果
});
</script>

實例操作2

  • 當點擊按鈕開頭添加時在<li>這里是</li>元素前添加一個新元素泥张,內(nèi)容為用戶輸入的非空字符串;
  • 當點擊結尾添加時在最后一個 li 元素后添加用戶輸入的非空字符串.
  • 當點擊每一個元素li時控制臺展示該元素的文本內(nèi)容鞠值。
<ul class="ct">
    <li>這里是</li>
    <li>饑人谷</li>
    <li>任務班</li>
</ul>
<input class="ipt-add-content" placeholder="添加內(nèi)容"/>
<button id="btn-add-start">開頭添加</button>
<button id="btn-add-end">結尾添加</button>
<script>
var ct = $('.ct');
$('#btn-add-start').addEventListener('click', function(e){
    var createLi = document.createElement('li');
    var content = $('.ipt-add-content').value;
    if(content){
        createLi.innerText = content;
        ct.insertBefore(createLi, ct.firstChild );
    }
})
$('#btn-add-end').addEventListener('click', function(e){
    var createLi = document.createElement('li');
    var content = $('.ipt-add-content').value;
    if(content){
        createLi.innerText = content;
        ct.appendChild(createLi);
    }
})
$('.ct').addEventListener('click', function(e){
    console.log(e.target.innerText)
})
function $(el){
    return document.querySelector(el);
}
</script>

實例操作2

  • 當鼠標放置在li元素上媚创,會在img-preview里展示當前l(fā)i元素的data-img對應的圖片。
<ul class="ct">
    <li data-img="https://jscode.me/user_avatar/jscode.me/bolong/64/3978_1.png">鼠標放置查看圖片1</li>
    <li data-img="https://jscode.me/user_avatar/jscode.me/bolong/64/3978_2.png">鼠標放置查看圖片2</li>
    <li data-img="https://jscode.me/uploads/default/original/1X/270d05f57fc86712517c9a6d58dc282505365271.png">鼠標放置查看圖片3</li>
</ul>
<div class="img-preview"></div>
<script>
var ct = document.querySelector('.ct');
var li = document.querySelectorAll('.ct li');
var preview = document.querySelector('.img-preview');
// 第一種方法 給li 添加事件
for (var i = 0; i < li.length; i++) {
    li[i].addEventListener('mouseenter', function () {
        var img = this.getAttribute('data-img');
        preview.innerHTML = '![](' + img + ')';
    })
}
// 第二種方法 給父級添加一個事件彤恶,然后去找它的子級
// ct.addEventListener('mouseover', function(event) {
//  if(event.target.nodeName.toLowerCase() === 'li'){
//      var img = document.createElement('img');
//         img.src = event.target.getAttribute('data-img');
//         preview.appendChild(img);
//  }
// });
// 添加移出事件
ct.addEventListener('mouseout', function (event) {
    if (event.target.nodeName.toLowerCase() === 'li') {
        preview.innerHTML = '';
    }
});
</script>

事件函數(shù)封裝

JavaScript事件兼容的函數(shù)

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钞钙,一起剝皮案震驚了整個濱河市鳄橘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芒炼,老刑警劉巖瘫怜,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異本刽,居然都是意外死亡鲸湃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門子寓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暗挑,“玉大人,你說我怎么就攤上這事斜友≌桑” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵蝙寨,是天一觀的道長晒衩。 經(jīng)常有香客問我,道長墙歪,這世上最難降的妖魔是什么听系? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮虹菲,結果婚禮上靠胜,老公的妹妹穿的比我還像新娘。我一直安慰自己毕源,他們只是感情好浪漠,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霎褐,像睡著了一般址愿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冻璃,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天响谓,我揣著相機與錄音,去河邊找鬼省艳。 笑死娘纷,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的跋炕。 我是一名探鬼主播赖晶,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辐烂!你這毒婦竟也來了遏插?” 一聲冷哼從身側響起捂贿,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胳嘲,沒想到半個月后眷蜓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡胎围,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年吁系,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片白魂。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡汽纤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出福荸,到底是詐尸還是另有隱情蕴坪,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布敬锐,位于F島的核電站背传,受9級特大地震影響,放射性物質發(fā)生泄漏台夺。R本人自食惡果不足惜径玖,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颤介。 院中可真熱鬧梳星,春花似錦、人聲如沸滚朵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辕近。三九已至韵吨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間移宅,已是汗流浹背归粉。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吞杭,地道東北人盏浇。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓变丧,卻偏偏與公主長得像芽狗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痒蓬,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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

  • 問答 一、dom對象的innerText和innerHTML有什么區(qū)別顾复? innerTextinnerText是一...
    婷樓沐熙閱讀 398評論 0 0
  • 題目1: DOM0 事件和DOM2級在事件監(jiān)聽使用方式上有什么區(qū)別班挖? Dom0級Dom0級事件處理程序是將一個函數(shù)...
    QQQQQCY閱讀 316評論 0 0
  • 1.DOM0 事件和DOM2級在事件監(jiān)聽使用方式上有什么區(qū)別? DOM0:在DOM0級事件處理程序芯砸,事件名以'on...
    saintkl閱讀 237評論 0 0
  • DOM0級和DOM2級在事件監(jiān)聽使用方式上有什么區(qū)別萧芙? DOM0級事件監(jiān)聽:用JavaScript指定事件處理程序...
    LeeoZz閱讀 368評論 0 1
  • 我從2016年的10月第一次參加馬楠老師的課程,《從零學OH》,學完之后我并沒有使用假丧,還覺得這課沒有啥白學了双揪。 2...
    66f7eee7a750閱讀 166評論 0 0