js事件

JavaScript和HTML的交互是通過事件實現(xiàn)的智亮。JavaScript采用異步事件驅(qū)動編程模型,當(dāng)文檔继谚、瀏覽器、元素或與之相關(guān)對象發(fā)生特定事情時阵幸,瀏覽器會產(chǎn)生事件花履。如果JavaScript關(guān)注特定類型事件,那么它可以注冊當(dāng)這類事件發(fā)生時要調(diào)用的句柄

  • 事件是某個行為或者觸發(fā)挚赊,比如點擊诡壁、鼠標移動
  • 當(dāng)用戶點擊鼠標時
  • 當(dāng)網(wǎng)頁已加載時
  • 當(dāng)圖像已加載時
  • 當(dāng)鼠標移動到元素上時
  • 當(dāng)用戶觸發(fā)按鍵時...

事件流

事件流描述的是從頁面中接收事件的順序,比如有兩個嵌套的div荠割,點擊了內(nèi)層的div妹卿,這時候是內(nèi)層的div先觸發(fā)click事件還是外層先觸發(fā)旺矾?目前主要有三種模型

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

Netscape的事件捕獲:不太具體的節(jié)點更早接收事件夺克,而最具體的元素最后接收事件箕宙,和事件冒泡相反

DOM事件流:DOM2級事件規(guī)定事件流包括三個階段,事件捕獲階段铺纽,處于目標階段柬帕,事件冒泡階段,首先發(fā)生的是事件捕獲狡门,為截取事件提供機會陷寝,然后是實際目標接收事件,最后是冒泡階段

這種分歧在日常生活中也很常見融撞,舉個例子盼铁,某個地方出了搶劫事件,我們有多種處理方式

村里先發(fā)現(xiàn)尝偎,報告給鄉(xiāng)里饶火,鄉(xiāng)里報告到縣城,縣城報告給市里致扯。肤寝。。抖僵。
市里先知道這事兒鲤看,然后交代給縣城怎么處理,縣城交給到鄉(xiāng)里處理耍群,鄉(xiāng)里交給村里處理
Opera义桂、Firefox、Chrome蹈垢、Safari都支持DOM事件流慷吊,IE不支持事件流,只支持事件冒泡

如有以下html

<!DOCTYPE html >
<html>
<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <title>Test Page</title>
</head>
<body>
    <div>
        Click Here</div>
</body>
</html>

事件冒泡

示例:



點擊hello曹抬,瀏覽器依次處理hello溉瓶,box,container谤民。

事件捕獲

示例:


同樣點擊hello堰酿,瀏覽器依次處理container,box,hello
事件捕獲與冒泡操作

事件處理程序

我們也稱之為事件偵聽器(listener),事件就是用戶或瀏覽器自身執(zhí)行的某種動作张足。比如click触创、load、mouseover等为牍,都是事件類型(俗稱事件名稱)哼绑,而響應(yīng)某個事件的方法就叫做事件處理程序或者事件監(jiān)聽器

也就是我們需要提前定義好某些事件發(fā)生了該怎么處理顺饮,這個過程叫做綁定事件處理程序,了解了這些凌那,我們看看如何給元素添加事件處理程序

HTML內(nèi)聯(lián)方式

元素支持的每個事件都可以使用一個相應(yīng)事件處理程序同名的HTML屬性指定。這個屬性的值應(yīng)該是可以執(zhí)行的JavaScript代碼吟逝,我們可以為一個button添加click事件處理程序

<input type="button" value="Click Here" onclick="alert('Clicked!');" />     //不常用

在HTML事件處理程序中可以包含要執(zhí)行的具體動作帽蝶,也可以調(diào)用在頁面其它地方定義的腳本,剛才的例子可以寫成這樣

<input type="button" value="Click Here" onclick="showMessage();" />

在HTML中指定事件處理程序書寫很方便,但是有兩個缺點块攒。

  1. 存在加載順序問題励稳,如果事件處理程序在html代碼之后加載,用戶可能在事件處理程序還未加載完成時就點擊按鈕之類的觸發(fā)事件囱井,存在時間差問題

  2. 這樣書寫html代碼和JavaScript代碼緊密耦合驹尼,維護不方便

JavaScript指定事件處理程序

通過JavaScript指定事件處理程序就是把一個方法賦值給一個元素的事件處理程序?qū)傩浴?/p>

每個元素都有自己的事件處理程序?qū)傩裕@些屬性名稱通常為小寫庞呕,如onclick等新翎,將這些屬性的值設(shè)置為一個函數(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);     //this代表當(dāng)前元素btnClick
    };
</script>

這樣處理地啰,事件處理程序被認為是元素的方法,事件處理程序在元素的作用域下運行讲逛,this就是當(dāng)前元素亏吝,所以點擊button結(jié)果是:btnClick

這樣還有一個好處,我們可以刪除事件處理程序盏混,只需把元素的onclick屬性賦為null即可

js制定事件處理多次使用只執(zhí)行最后的事件蔚鸥,如下:


上圖鏈接

DOM2事件處理程序

DOM2級事件定義了兩個方法用于處理指定和刪除事件處理程序的操作:

  1. addEventListener

  2. removeEventListener
    所有的DOM節(jié)點都包含這兩個方法,并且它們都接受三個參數(shù):

  3. 事件類型

  4. 事件處理方法

  5. 布爾參數(shù)许赃,如果是true表示在捕獲階段調(diào)用事件處理程序止喷,如果是false,則是在事件冒泡階段處理
    剛才的例子我們可以這樣寫

<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>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末图焰,一起剝皮案震驚了整個濱河市启盛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌技羔,老刑警劉巖僵闯,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異藤滥,居然都是意外死亡鳖粟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門拙绊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來向图,“玉大人泳秀,你說我怎么就攤上這事¢剩” “怎么了嗜傅?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長檩赢。 經(jīng)常有香客問我吕嘀,道長,這世上最難降的妖魔是什么贞瞒? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任偶房,我火速辦了婚禮,結(jié)果婚禮上军浆,老公的妹妹穿的比我還像新娘棕洋。我一直安慰自己,他們只是感情好乒融,可當(dāng)我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布掰盘。 她就那樣靜靜地躺著,像睡著了一般赞季。 火紅的嫁衣襯著肌膚如雪庆杜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天碟摆,我揣著相機與錄音晃财,去河邊找鬼。 笑死典蜕,一個胖子當(dāng)著我的面吹牛断盛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播愉舔,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼钢猛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了轩缤?” 一聲冷哼從身側(cè)響起命迈,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎火的,沒想到半個月后壶愤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡馏鹤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年征椒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片湃累。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡勃救,死狀恐怖碍讨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蒙秒,我是刑警寧澤勃黍,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站晕讲,受9級特大地震影響溉躲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜益兄,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望箭券。 院中可真熱鬧净捅,春花似錦、人聲如沸辩块。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽废亭。三九已至国章,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間豆村,已是汗流浹背液兽。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掌动,地道東北人四啰。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像粗恢,于是被迫代替她去往敵國和親柑晒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,492評論 2 348

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

  • 1:DOM0事件和DOM2級在事件監(jiān)聽使用方式上有什么區(qū)別眷射? 瀏覽器端的JavaScript采用的是事件驅(qū)動的異步...
    饑人谷_bigJiao閱讀 279評論 0 0
  • 關(guān)鍵詞:事件 1. DOM0事件和DOM2級在事件監(jiān)聽使用方式上有何區(qū)別匙赞? 事件處理程序(事件監(jiān)聽器)有以下幾種:...
    NathanYangcn閱讀 233評論 0 1
  • 事件 JavaScript和HTML的交互是通過事件實現(xiàn)的。JavaScript采用異步事件驅(qū)動編程模型妖碉,當(dāng)文檔涌庭、...
    bpup閱讀 651評論 0 1
  • 事件流 事件流描述的是從頁面中接受事件的順序,在IE中的事件流是事件冒泡欧宜,在Netscape的事件流是事件捕獲流脾猛。...
    FeRookie閱讀 300評論 0 4
  • JavaScript 程序采用了異步事件驅(qū)動編程模型。在這種程序設(shè)計風(fēng)格下鱼鸠,當(dāng)文檔猛拴、瀏覽器羹铅、元素或與之相關(guān)的對象發(fā)...
    劼哥stone閱讀 1,252評論 3 11