事件簡介

JavaScript 與 HTML 之間的交互是通過事件實(shí)現(xiàn)的土铺。事件最早是在 IE3 和Netscape Navigator 2 中出現(xiàn)的,當(dāng)時(shí)是作為分擔(dān)服務(wù)器運(yùn)算負(fù)載的一種手段。在 IE4 和 Navigator 4 發(fā)布時(shí)吃引,這兩種瀏覽器都提供了相似但不相同的 API佛析,這些 API 并存經(jīng)過了好幾個(gè)主要版本。DOM2級規(guī)范開始嘗試以一種符合邏輯的方式來標(biāo)準(zhǔn)化 DOM 事件闯参。IE9瞻鹏、Firefox、Opera鹿寨、Safari 和 Chrome 全都已經(jīng)實(shí)現(xiàn)了“DOM2 級事件”模塊的核心部分新博。IE8 是最后一個(gè)仍然使用其專有事件系統(tǒng)的主要瀏覽器。

事件流

“DOM2級事件”規(guī)定的事件流包括三個(gè)階段:事件捕獲階段脚草、處于目標(biāo)階段和事件冒泡階段赫悄。IE9、Opera馏慨、Firefox埂淮、Chrome 和 Safari 都支持 DOM 事件流;IE8 及更早版本不支持 事件捕獲写隶。

事件處理程序

有四種指定事件處理程序的方法

  • 使用HTML屬性指定倔撞,如:
// 使用這種方式指定事件處理程序的話,相當(dāng)于將onclick屬性值作為一段js代碼包裹在一個(gè)函數(shù)里面然后指給該元素對象的onclick屬性
// 該函數(shù)內(nèi)部有一個(gè)局部變量event
<button type="button" onclick="alert(event.type)">click me</button>

// 也可以在里面執(zhí)行其他函數(shù)慕趴,在該函數(shù)內(nèi)部可以訪問全局作用域里的其他函數(shù)
<button type="button" onclick="showMessage()">click me</button>

// 這個(gè)動(dòng)態(tài)創(chuàng)建的函數(shù)使用with擴(kuò)展作用域
// with語句的作用就是在代碼塊內(nèi)部訪問變量時(shí)痪蝇,現(xiàn)將其看作局部變量,如果找不到秩贰,就在傳入的參數(shù)對象內(nèi)部查找該屬性
function(){ 
  with(document){ 
    with(this){ 
      //元素屬性值
    } 
  }
} 
// 因此下面的innerText === this.innerText
<button type="button" onclick="alert(innerText)">click me</button>

// 如果當(dāng)前元素是一個(gè)表單輸入元素霹俺,則作用域中還會(huì)包含訪問表單元素的入口,這個(gè)函數(shù)就變成了如下所示:
function() {
  with(document) {
    with(this.form) {
      with(this) {
        //元素屬性值
      }
    }
  }
}
// 這樣的下面的代碼就可以理解了
form method="post"> 
 <input type="text" name="username" value=""> 
 <input type="button" value="Echo Username" onclick="alert(username.value)"> 
</form> 
  • DOM0級指定方法
var btn = document.getElementById("myBtn");
// 這種方法比較簡單毒费,在冒泡階段觸發(fā)丙唧,不過不能為同一個(gè)元素添加多個(gè)事件處理程序
btn.onclick = function() {
  alert(this.id); //"myBtn" 
};
//刪除事件處理程序
btn.onclick = null; 
  • DOM2級指定方法(IE9以上)
var btn = document.getElementById("myBtn");
// 第三個(gè)參數(shù)為true,表示在捕獲階段觸發(fā)觅玻,一般不使用
btn.addEventListener("click", function(e) {
  alert(this.id);
}, false);
// 主要好處是可以添加多個(gè)事件處理程序想际,會(huì)按照添加它們的順序觸發(fā)

// 移除時(shí)傳入的參數(shù)要與添加處理程序時(shí)使用的參數(shù)相同。這也意味著匿名函數(shù)將無法移除
var btn = document.getElementById("myBtn"); 
var handler = function(){ 
  alert(this.id); 
}; 
btn.addEventListener("click", handler, false); 
btn.removeEventListener("click", handler, false); //有效溪厘!
  • IE8及以下使用的方法
// 只支持冒泡階段觸發(fā)胡本,第一個(gè)參數(shù)和DOM2相比多了'on'
var btn = document.getElementById("myBtn"); 
btn.attachEvent("onclick", function(){ 
  // this指向window而不是元素本身
  alert(this === window); //true 
  alert("Clicked"); 
}); 
// 也可以用來為一個(gè)元素添加多個(gè)事件處理程序,不過不是以添加它們的順序執(zhí)行畸悬,而是以相反的順序被觸發(fā)侧甫。
// 和DOM2一樣,匿名函數(shù)將無法移除

事件對象

一些比較重要的屬性

  • currentTarget:代表被觸發(fā)事件處理程序的那個(gè)元素
  • target:代表事件的實(shí)際目標(biāo),一次交互只會(huì)有唯一一個(gè)目標(biāo)
  • eventPhase:1-捕獲階段 2-處于目標(biāo)上 3-冒泡階段
  • preventDefault():取消事件的默認(rèn)行為
  • stopPropagation():取消事件的進(jìn)一步捕獲或冒泡

IE的事件對象的一些比較重要的屬性

  • srcElement:等于target
  • cancelBubble:默認(rèn)為false披粟,但將其設(shè)置為true就可以取消事件冒泡(與stopPropagation()方法的作用相同咒锻,不過只能取消冒泡)
  • returnValue:默認(rèn)為true,但將其設(shè)置為false就可以取消事件的默認(rèn)行為(與preventDefault()方法的作用相同)

事件委托的優(yōu)缺點(diǎn)

https://www.cnblogs.com/wangdapeng/p/6601405.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末守屉,一起剝皮案震驚了整個(gè)濱河市惑艇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拇泛,老刑警劉巖滨巴,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異俺叭,居然都是意外死亡恭取,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進(jìn)店門绪颖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秽荤,“玉大人甜奄,你說我怎么就攤上這事柠横。” “怎么了课兄?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵牍氛,是天一觀的道長。 經(jīng)常有香客問我烟阐,道長搬俊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任蜒茄,我火速辦了婚禮唉擂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘檀葛。我一直安慰自己玩祟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布屿聋。 她就那樣靜靜地躺著空扎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪润讥。 梳的紋絲不亂的頭發(fā)上转锈,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天,我揣著相機(jī)與錄音楚殿,去河邊找鬼撮慨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砌溺。 我是一名探鬼主播菇曲,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抚吠!你這毒婦竟也來了常潮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤楷力,失蹤者是張志新(化名)和其女友劉穎喊式,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萧朝,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岔留,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了检柬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片献联。...
    茶點(diǎn)故事閱讀 38,777評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖何址,靈堂內(nèi)的尸體忽然破棺而出里逆,到底是詐尸還是另有隱情,我是刑警寧澤用爪,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布原押,位于F島的核電站,受9級特大地震影響偎血,放射性物質(zhì)發(fā)生泄漏诸衔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一颇玷、第九天 我趴在偏房一處隱蔽的房頂上張望笨农。 院中可真熱鬧,春花似錦帖渠、人聲如沸谒亦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诊霹。三九已至,卻和暖如春渣淳,著一層夾襖步出監(jiān)牢的瞬間脾还,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工入愧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鄙漏,地道東北人嗤谚。 一個(gè)月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像怔蚌,于是被迫代替她去往敵國和親巩步。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評論 2 351

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

  • ??JavaScript 與 HTML 之間的交互是通過事件實(shí)現(xiàn)的。 ??事件籍胯,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,477評論 1 11
  • 事件流 JavaScript與HTML之間的交互是通過事件實(shí)現(xiàn)的竟闪。事件,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特定的交互...
    DHFE閱讀 824評論 0 3
  • JavaScript 程序采用了異步事件驅(qū)動(dòng)編程模型杖狼。在這種程序設(shè)計(jì)風(fēng)格下炼蛤,當(dāng)文檔、瀏覽器蝶涩、元素或與之相關(guān)的對象發(fā)...
    劼哥stone閱讀 1,253評論 3 11
  • 前言:之前的上傳圖片用到了event.target理朋,但是后來仔細(xì)思考了一下,自己對event.target绿聘,thi...
    Ruby君閱讀 2,005評論 1 3
  • js之事件機(jī)制 1嗽上、事件初探 1.1 js事件的概述 JavaScript事件:JavaScript是基于事件驅(qū)動(dòng)...
    道無虛閱讀 2,343評論 1 3