第13章 事件

13.1 事件流

事件流描述的是從頁面中接收事件的順序。

當(dāng)瀏覽器發(fā)展到第四代時(shí)继低,瀏覽器開發(fā)團(tuán)隊(duì)遇到了一個(gè)很有意思的問題:頁面的哪一部分會(huì)擁有某個(gè)特定事件黑界?

針對(duì)這一個(gè)問題,IE提出了事件冒泡羹蚣,Netscape提出了事件捕獲

13.1.1 事件冒泡

即事件開始時(shí)由最具體的元素(文檔中嵌套層次最深的那個(gè)節(jié)點(diǎn))接收原探,然后逐級(jí)向上傳播到較為不具體的節(jié)點(diǎn)(文檔)。

13.1.2 事件捕獲

即不太具體的節(jié)點(diǎn)應(yīng)該更早接收到事件顽素,而最具體的節(jié)點(diǎn)應(yīng)該最后接收到事件踢匣。

由于老版本的瀏覽器不支持,因此很少有人使用事件捕獲戈抄。我們也建議大家放心的使用事件冒泡离唬,在有特殊需要時(shí)再使用事件捕獲。

13.1.3 DOM事件流

13.2 事件處理程序

響應(yīng)某個(gè)事件的函數(shù)叫做事件處理程序划鸽,比如onclick

13.2.1 HTML事件處理程序

<input type = 'button' value="Click me" onclick = 'showMsg()' />

function showMsg(){
  
}

缺點(diǎn):
(1) 存在時(shí)差問題输莺。如果showMsg定位在頁面最底部,用戶在showMsg函數(shù)未解析之前點(diǎn)擊按鈕裸诽,會(huì)發(fā)生錯(cuò)誤嫂用。
(2) 不同瀏覽器對(duì)其中作用域鏈理解不一樣。
(3) html和js耦合太嚴(yán)重丈冬。

13.2 DOM0級(jí)事件處理程序

var btn = document.getElementById('myBtn');

btn.onclick = function(){
    alert(this.id);      //myBtn
}

使用DOM0級(jí)方法指定的事件處理程序被認(rèn)為是元素的方法嘱函,因此,程序中的this引用當(dāng)前元素埂蕊。

13.2.3 DOM2級(jí)事件處理程序

即事件監(jiān)聽往弓。使用addEventListener()和removeEventListener();

13.2.4 IE事件處理程序

事件監(jiān)聽。attachEvent() 和 detachEvent()

13.3 事件對(duì)象

即event蓄氧,在觸發(fā)DOM上的某個(gè)事件時(shí)函似,會(huì)產(chǎn)生一個(gè)事件對(duì)象event,這個(gè)對(duì)象包含著所有與事件有關(guān)的信息喉童。

13.3.1 DOM中的事件對(duì)象撇寞。

在需要通過一個(gè)函數(shù)處理多個(gè)事件時(shí),可以這樣:

var btn = document.getElementById('myBtn');

var handler = function(event){
    
    switch(event.type){
       case "click":
           alert('Clicked');
           break;

       case 'mouseover':
           alert('mouseover');
           break;

       case 'mouseout':
           alert(mouseout);
           break;
    }
}

btn.onclick = handler;
btn.onmouseover = handler;
btn.mouseout = mouseout;

阻止默認(rèn)行為:

event.preventDefault();

阻止冒泡

event.stopPropagation();

event.eventPhase 用來確定事件當(dāng)前正位于事件流的哪個(gè)階段堂氯。
1: 捕獲階段
2: 處于目標(biāo)對(duì)象上
3: 冒泡階段

13.4 事件類型

13.4.1 UI事件

指的是那些不一定與用戶操作有關(guān)的事件

這些事件都與window對(duì)象有關(guān)

(1) load事件(圖像蔑担,JS,CSS文件等都可以)

在相應(yīng)對(duì)象上監(jiān)聽load事件即可

(2) unload事件
(3) resize事件
(4) scroll事件

13.4.2 焦點(diǎn)事件

(1) blur 在元素失去焦點(diǎn)時(shí)觸發(fā)咽白,這個(gè)事件不會(huì)冒泡啤握。
(2) focus 在元素獲得焦點(diǎn)時(shí)觸發(fā),這個(gè)事件不會(huì)冒泡局扶。

13.4.3 鼠標(biāo)與滾輪事件

(1) click
(2) dblclick
(3) mousedown 用戶按下任意鼠標(biāo)按鈕時(shí)觸發(fā)恨统。不能通過鍵盤觸發(fā)叁扫。
(4) mouseenter 鼠標(biāo)光標(biāo)從元素外部首次移動(dòng)到元素范圍之內(nèi)時(shí)觸發(fā)。這個(gè)事件不冒泡畜埋,而且在光標(biāo)移動(dòng)到后代元素上不會(huì)觸發(fā)莫绣。
(5) mouseleave 在位于元素上方的鼠標(biāo)光標(biāo)移動(dòng)到元素范圍之內(nèi)時(shí)觸發(fā)。這個(gè)事件不冒泡悠鞍,而且在光標(biāo)移動(dòng)到后代元素上不會(huì)觸發(fā)对室。
(6) mousemove 當(dāng)鼠標(biāo)指針在元素內(nèi)部移動(dòng)時(shí) 重復(fù) 觸發(fā)。
(7) mouseout 在鼠標(biāo)指針位于一個(gè)元素上方咖祭,然后用戶將其移入另一個(gè)元素時(shí)觸發(fā)掩宜。又移入的另一個(gè)元素可能位于前一個(gè)元素的外部,
也可能是這個(gè)元素的子元素么翰。
(8) mouseover 在鼠標(biāo)指針位于一個(gè)元素外部牺汤,然后用戶將其首次移入另一個(gè)元素邊界之內(nèi)時(shí)觸發(fā)。
(9) mouseup 用戶釋放鼠標(biāo)按鈕時(shí)觸發(fā)浩嫌。

頁面上所有元素都支持鼠標(biāo)事件檐迟。除了mouseenter 和 mouseleave,所有鼠標(biāo)事件都會(huì)冒泡码耐,也可以被取消器腋,而取消鼠標(biāo)事件將會(huì)影響瀏覽器的默認(rèn)行為熏挎。

1. 客戶區(qū)坐標(biāo)位置

以頁面文檔左上角為原點(diǎn)集晚。
clientX:發(fā)生事件時(shí)鼠標(biāo)指針在視口中的水平坐標(biāo)
clientY:發(fā)生事件時(shí)鼠標(biāo)指針在視口中的垂直坐標(biāo)

2. 頁面坐標(biāo)位置

在頁面沒有滾動(dòng)情況下炸渡,pageX和pageY的值與clientX和clientY的值相等

有滾動(dòng)情況下:
pageY = 鼠標(biāo)舉例文檔頂部距離 + 垂直滾動(dòng)距離
clientY = 鼠標(biāo)舉例文檔頂部距離

3. 屏幕坐標(biāo)位置

鼠標(biāo)事件發(fā)生時(shí),不僅會(huì)有相對(duì)于瀏覽器窗口的位置束铭,還有一個(gè)相對(duì)于整個(gè)電腦屏幕的位置

screenX和screenY

13.4.5 復(fù)合事件

13.4.7 HTML5事件

1. contextmenu 用以表示何時(shí)應(yīng)該顯示上下文菜單廓块,以便開發(fā)人員取消默認(rèn)的上下文菜單而提供自定義的菜單。

禁止默認(rèn)行為纯露,正常瀏覽器:event.preventDefault() IE:event.returnValue = false;

2. beforeunload 事件
3. DOMContentLoaded剿骨。在形成完整的DOM樹之后就會(huì)觸發(fā),不理會(huì)圖像埠褪,JS文件,CSS文件或其他資源是否已經(jīng)下載完畢挤庇。

13.5 內(nèi)存和性能

在js中钞速,添加到頁面上的事件處理程序數(shù)量將直接關(guān)系到頁面的整體運(yùn)行性能。事實(shí)上嫡秕,從如何利用好事件處理程序的角度出發(fā)渴语,還是有一些方法能夠提升性能的。

13.5.1 事件委托

當(dāng)頁面上很多元素需要觸發(fā)同一事件時(shí)昆咽,可考慮使用事件委托來提高性能驾凶。

<ul id="myLinks">
    <li id="doSomeWhere">doSomeWhere</li>
    <li id="doSomeThing">doSomeThing</li>
    <li id="sayHi">sayHi</li>
</ul>

var list = $('#myLinks')
$(list).on('click', function(e){
   var target = $(e.target)[0];
   e.stopPropagation();

   switch(target.id){

    case 'doSomeWhere':
        alert('doSomeWhere');
        break;

    case 'doSomeThing':
        alert('doSomeThing');
        break;

    case 'sayHi':
        alert('sayHi');
        break;
   }
})

13.5.2 移除事件處理程序

解綁事件

13.6 模擬事件

13.6.1 DOM中的事件模擬

小結(jié):

在使用事件時(shí)牙甫,需要考慮如下一些內(nèi)存與性能方面的問題:

(1) 有必要限制一個(gè)頁面中事件處理程序的數(shù)量,數(shù)量太多會(huì)導(dǎo)致占用大量?jī)?nèi)存调违,而且也會(huì)讓用戶感覺頁面反應(yīng)不靈敏窟哺。
(2) 建立在事件冒泡機(jī)制之上的事件委托技術(shù),可以有效地減少事件處理程序的數(shù)量
(3) 建議在瀏覽器卸載頁面之前移除頁面中的所有事件處理程序技肩。即解綁不用的事件處理程序且轨。(btn.onclick = null)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市虚婿,隨后出現(xiàn)的幾起案子旋奢,更是在濱河造成了極大的恐慌,老刑警劉巖然痊,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件至朗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡剧浸,警方通過查閱死者的電腦和手機(jī)锹引,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辛蚊,“玉大人粤蝎,你說我怎么就攤上這事〈恚” “怎么了初澎?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)虑凛。 經(jīng)常有香客問我碑宴,道長(zhǎng),這世上最難降的妖魔是什么桑谍? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任延柠,我火速辦了婚禮,結(jié)果婚禮上锣披,老公的妹妹穿的比我還像新娘贞间。我一直安慰自己,他們只是感情好雹仿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布增热。 她就那樣靜靜地躺著,像睡著了一般胧辽。 火紅的嫁衣襯著肌膚如雪峻仇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天邑商,我揣著相機(jī)與錄音摄咆,去河邊找鬼凡蚜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吭从,可吹牛的內(nèi)容都是我干的朝蜘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼影锈,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼芹务!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鸭廷,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤枣抱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后辆床,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佳晶,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年讼载,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了轿秧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咨堤,死狀恐怖菇篡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情一喘,我是刑警寧澤驱还,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站凸克,受9級(jí)特大地震影響议蟆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜萎战,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一咐容、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚂维,春花似錦戳粒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至孝鹊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間展蒂,已是汗流浹背又活。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工苔咪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柳骄。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓团赏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親耐薯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子舔清,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • 13.1 事件流 “DOM2級(jí)事件”規(guī)定事件流包括3個(gè)階段:事件捕獲階段体谒,處于目標(biāo)階段,事件冒泡階段臼婆。事件捕獲表示...
    Elevens_regret閱讀 423評(píng)論 0 0
  • 本章內(nèi)容 理解事件流 使用事件處理程序 不同的事件類型 JavaScript 與 HTML 之間的交互是通過事件實(shí)...
    悶油瓶小張閱讀 283評(píng)論 0 0
  • 總結(jié): 鼠標(biāo)事件 1.click與dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r閱讀 1,607評(píng)論 2 10
  • 之前沒有讀過凱文凱利的任何作品颁褂,但事實(shí)是故响,我確實(shí)更加喜歡預(yù)測(cè)類的文章,想知道未來是什么樣子的颁独。嚇尿理論告訴我們彩届,人...
    Zenith_Swimmer閱讀 165評(píng)論 0 0
  • 我想我曾經(jīng)來過這里 彎彎扭扭的小徑看不到頭 互相交叉著 伸向天際的小河邊 連小徑上都散落著的樹葉 五彩斑斕 光的影...
    蒼狼0001閱讀 263評(píng)論 0 0