JavaScript—事件

聲明:本欄目所使用的素材都是凱哥學(xué)堂VIP學(xué)員所寫(xiě)誊爹,學(xué)員有權(quán)匿名,對(duì)文章有最終解釋權(quán);凱哥學(xué)堂旨在促進(jìn)VIP學(xué)員互相學(xué)習(xí)的基礎(chǔ)上公開(kāi)筆記彼宠。

JavaScript—事件

事件機(jī)制:

在用戶使用鍵盤(pán)、鼠標(biāo)等設(shè)備進(jìn)行操作時(shí)弟塞,實(shí)際上每一次的操作都是在發(fā)起一個(gè)事件凭峡。

當(dāng)我們的鼠標(biāo)點(diǎn)擊到窗口上的按鈕時(shí),并不是鼠標(biāo)的箭頭真正點(diǎn)擊到這個(gè)按鈕了决记,而是鼠標(biāo)發(fā)出了一個(gè)動(dòng)作事件摧冀,然后這個(gè)事件先被傳送到了操作系統(tǒng)的命令處理帶,然后再傳送到負(fù)責(zé)顯示圖形的圖像數(shù)據(jù)層系宫,事件到這里后圖像數(shù)據(jù)層會(huì)先看哪個(gè)程序的窗口在最上面(因?yàn)椴皇窃谧钌厦婢蜎](méi)必要看了)索昂,再根據(jù)鼠標(biāo)提供的X Y坐標(biāo)確認(rèn)點(diǎn)擊的是哪個(gè)窗口上的按鈕,接著再確認(rèn)這個(gè)窗口是哪個(gè)程序扩借。

確認(rèn)完畢后椒惨,圖像數(shù)據(jù)層就會(huì)將這個(gè)動(dòng)作事件提交給相對(duì)應(yīng)的執(zhí)行程序,執(zhí)行程序里的代碼先尋找是哪個(gè)位置的數(shù)據(jù)哪個(gè)對(duì)象提供的潮罪,進(jìn)行一系列的搜索康谆,找到后這個(gè)對(duì)象就會(huì)執(zhí)行相對(duì)應(yīng)的代碼,然后再將執(zhí)行后的顯示傳送到圖像數(shù)據(jù)中心進(jìn)行顯示嫉到。我們就會(huì)看到鼠標(biāo)點(diǎn)擊到了這個(gè)按鈕沃暗。

之所以平時(shí)使用的時(shí)候沒(méi)感覺(jué)出來(lái),是因?yàn)檫@一系列的復(fù)雜的機(jī)制都是在瞬間完成的何恶,只有在電腦卡頓的情況下才能感覺(jué)到點(diǎn)擊后要等一段時(shí)間才會(huì)做出相應(yīng)的響應(yīng)孽锥。

示意圖:

事件委托:

這其中有一個(gè)事件委托的概念,我們需要在代碼中把事件委托也可以說(shuō)是注冊(cè)到按鈕上细层,這時(shí)會(huì)有一個(gè)監(jiān)聽(tīng)器監(jiān)聽(tīng)著這個(gè)按鈕忱叭,當(dāng)用戶點(diǎn)擊按鈕時(shí)就會(huì)去調(diào)用委托事件中的代碼隔崎,這些代碼都寫(xiě)在函數(shù)中。

所以簡(jiǎn)單來(lái)說(shuō)韵丑,就是把一個(gè)寫(xiě)好的函數(shù)通過(guò)事件委托到按鈕上爵卒,當(dāng)用戶點(diǎn)擊按鈕后,就會(huì)調(diào)用那個(gè)函數(shù)撵彻,函數(shù)里的代碼就會(huì)執(zhí)行钓株。

例如:我把一段打印Hello World的函數(shù),通過(guò)事件委托到按鈕上陌僵,當(dāng)我點(diǎn)擊這個(gè)按鈕的時(shí)候就會(huì)調(diào)用這個(gè)函數(shù)轴合,函數(shù)執(zhí)行完之后就會(huì)打印Hello World。

以上提到的事件只是眾多事件類(lèi)型中的一種點(diǎn)擊事件碗短,事件是有很多種類(lèi)型的受葛,例如:鼠標(biāo)的單擊、雙擊偎谁、滾軸总滩,鍵盤(pán)的按鍵彈起、按下巡雨、長(zhǎng)按等等闰渔,反正很多就是了,還有一些是某些元素特有的事件铐望。

在介紹如何委托事件前冈涧,先介紹一下如何控制元素對(duì)象(標(biāo)簽對(duì)象),因?yàn)橛行┪惺录姆绞叫枰カ@得元素對(duì)象來(lái)進(jìn)行事件的委托:

第一種獲得方式是通過(guò)id去獲得正蛙,這種方式需要用document對(duì)象去調(diào)用getElementById函數(shù)并傳遞元素的id值督弓,就可以獲得該id值的元素對(duì)象。

代碼示例:

運(yùn)行結(jié)果:

從審查元素中可以看到id值為test_sbutton的元素中的value值乒验,為我js代碼里設(shè)置的值愚隧。

錯(cuò)誤示例:

因?yàn)榇a是是從上至下解析的,如果你要獲得body里面的元素對(duì)象徊件,卻把script寫(xiě)在了body前面奸攻,所以當(dāng)執(zhí)行js里面獲得元素對(duì)象的代碼時(shí)就會(huì)報(bào)錯(cuò):

代碼示例:

運(yùn)行結(jié)果:

第二種方式是直接使用id值蒜危,可以直接拿id值去定義該元素對(duì)象里面的屬性值:

代碼示例:

運(yùn)行結(jié)果:

以上只是介紹比較常見(jiàn)的兩種獲得元素對(duì)象的方式虱痕,除此之外還有很多種獲得方式,可以參考以下文章:

http://www.jb51.net/article/64874.htm

注意:id值不要設(shè)置重復(fù)的最好保持唯一性辐赞,如果設(shè)置重復(fù)的話部翘,js就不能直接獲得元素對(duì)象,而是會(huì)獲得一個(gè)對(duì)象數(shù)組响委,如果遇到id值重復(fù)的情況下新思,就得遍歷數(shù)組去獲得對(duì)象:

代碼示例:

運(yùn)行結(jié)果:

思維導(dǎo)圖:

接下來(lái)開(kāi)始介紹JavaScript中給元素委托事件的三種常用的方式:

第一種方式窖梁,寫(xiě)好函數(shù)代碼后,通過(guò)元素中的事件屬性進(jìn)行委托夹囚,下面用鼠標(biāo)事件中的mouseout和mouseover事件進(jìn)行演示纵刘,mousseout事件在鼠標(biāo)移動(dòng)出該元素時(shí)會(huì)觸發(fā),mouseover事件在鼠標(biāo)移動(dòng)進(jìn)該元素時(shí)會(huì)觸發(fā)荸哟,屬于焦點(diǎn)類(lèi)的事件:

代碼示例:

運(yùn)行結(jié)果:

當(dāng)鼠標(biāo)的光標(biāo)移動(dòng)進(jìn)按鈕時(shí)會(huì)觸發(fā)mouseover事件假哎,移動(dòng)出按鈕時(shí)會(huì)觸發(fā)mousseout事件,然后就會(huì)調(diào)用委托到事件中的函數(shù)代碼鞍历,函數(shù)被調(diào)用執(zhí)行就會(huì)在控制臺(tái)中輸出這些信息舵抹。

所謂焦點(diǎn)就是鼠標(biāo)的光標(biāo)的位置,例如當(dāng)你在文本框輸入文字時(shí)需要點(diǎn)擊一下文本框才能輸入劣砍,這就是要讓文本框獲得鼠標(biāo)焦點(diǎn)惧蛹。

第二種方式,通過(guò)id獲取元素對(duì)象刑枝,然后通過(guò)該對(duì)象調(diào)用事件屬性香嗓,使用函數(shù)表達(dá)式的方式把函數(shù)委托給事件:

代碼示例:

運(yùn)行結(jié)果:

除了函數(shù)表達(dá)式外也可以使用函數(shù)聲明的方式,把函數(shù)的名稱(chēng)賦值給元素對(duì)象的事件屬性仅讽,注意不能寫(xiě)上():

代碼示例:

運(yùn)行結(jié)果:

第三種方式陶缺,通過(guò)addEventListener函數(shù)添加一個(gè)事件監(jiān)聽(tīng)器,需要傳遞事件的名稱(chēng)洁灵,和函數(shù)對(duì)象饱岸,函數(shù)對(duì)象可以是函數(shù)的名稱(chēng),也可以是直接寫(xiě)一個(gè)函數(shù)上去:

代碼示例:

運(yùn)行結(jié)果:

同一個(gè)元素對(duì)象的同一個(gè)事件徽千,可以添加多個(gè)函數(shù)苫费,這些函數(shù)可以執(zhí)行不同的內(nèi)容,例如我在一個(gè)button元素的mouseover事件中分別添加了三個(gè)函數(shù)双抽,這三個(gè)函數(shù)各自打印了一句話百框,那么當(dāng)我鼠標(biāo)碰到按鈕時(shí),就會(huì)打印出三句話:

代碼示例:

運(yùn)行結(jié)果:

addEventListener函數(shù)還有一個(gè)布爾參數(shù)牍汹,這個(gè)參數(shù)定義著父元素和子元素重疊并且都有委托事件的情況時(shí)铐维,是先觸發(fā)父元素的事件還是先觸發(fā)子元素的事件,參數(shù)值為true是定義先觸發(fā)父元素的事件慎菲,參數(shù)值為false則是定義先觸發(fā)子元素的事件嫁蛇,不定義這個(gè)參數(shù)的話,默認(rèn)情況下是先觸發(fā)子元素的事件露该。

父元素和子元素重疊情況睬棚,不定義addEventListener函數(shù)布爾值的代碼示例:

運(yùn)行結(jié)果:

父元素和子元素重疊情況,定義addEventListener函數(shù)布爾值為true的代碼示例:

運(yùn)行結(jié)果:

還有一種情況就是父元素和子元素不完全重疊,這種情況下不定義addEventListener函數(shù)的布爾值抑党,當(dāng)鼠標(biāo)移動(dòng)到子元素時(shí)先觸發(fā)父元素的事件包警,然后移出子元素時(shí)先觸發(fā)子元素的事件再觸發(fā)父元素的事件,這是因?yàn)槟J(rèn)情況下子元素的事件先執(zhí)行底靠,所以父元素的事件不會(huì)連續(xù)執(zhí)行害晦。

定義addEventListener函數(shù)的布爾值為true的話,當(dāng)鼠標(biāo)移動(dòng)到子元素時(shí)先觸發(fā)父元素的事件暑中,然后移出子元素時(shí)還是觸發(fā)父元素的事件篱瞎,最后才觸發(fā)子元素的事件,這是因?yàn)椴紶栔禐閠rue的情況下父元素的事件先執(zhí)行痒芝,所以父元素的事件會(huì)連續(xù)執(zhí)行俐筋。

父元素和子元素不完全重疊的情況,不定義addEventListener函數(shù)布爾值的代碼示例:

運(yùn)行結(jié)果:

父元素的事件不會(huì)連續(xù)執(zhí)行

父元素和子元素不完全重疊的情況严衬,定義addEventListener函數(shù)布爾值為true的代碼示例:

運(yùn)行結(jié)果: 父元素的事件會(huì)連續(xù)執(zhí)行

事件源 Even: 事件源澄者,就是事件產(chǎn)生時(shí)的信息收集,可以通過(guò)事件源對(duì)象獲得很多相關(guān)數(shù)據(jù)请琳,可以設(shè)置元素的屬性粱挡,以下是常見(jiàn)的事件源對(duì)象屬性:

通過(guò)事件源對(duì)象調(diào)用target屬性設(shè)置元素的背景顏色代碼示例:

運(yùn)行結(jié)果:

以上只使用到了鼠標(biāo)事件中的mouseout和mouseover事件,事件還有很多俄精,以下是常見(jiàn)事件的分類(lèi)思維導(dǎo)圖:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末询筏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子竖慧,更是在濱河造成了極大的恐慌嫌套,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圾旨,死亡現(xiàn)場(chǎng)離奇詭異踱讨,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)砍的,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)痹筛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人廓鞠,你說(shuō)我怎么就攤上這事帚稠。” “怎么了床佳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵滋早,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我夕土,道長(zhǎng)馆衔,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任怨绣,我火速辦了婚禮角溃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘篮撑。我一直安慰自己减细,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布赢笨。 她就那樣靜靜地躺著未蝌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茧妒。 梳的紋絲不亂的頭發(fā)上萧吠,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音桐筏,去河邊找鬼纸型。 笑死,一個(gè)胖子當(dāng)著我的面吹牛梅忌,可吹牛的內(nèi)容都是我干的狰腌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼牧氮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼琼腔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起踱葛,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤丹莲,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后尸诽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體圾笨,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年逊谋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了擂达。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胶滋,死狀恐怖板鬓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情究恤,我是刑警寧澤俭令,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站部宿,受9級(jí)特大地震影響抄腔,放射性物質(zhì)發(fā)生泄漏瓢湃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一赫蛇、第九天 我趴在偏房一處隱蔽的房頂上張望绵患。 院中可真熱鬧,春花似錦悟耘、人聲如沸落蝙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)筏勒。三九已至,卻和暖如春旺嬉,著一層夾襖步出監(jiān)牢的瞬間管行,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工邪媳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留病瞳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓悲酷,卻偏偏與公主長(zhǎng)得像套菜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子设易,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

  • 事件處理程序在應(yīng)用中是必不可少的,雖然現(xiàn)在很多框架都有自己實(shí)現(xiàn)事件處理方法,但是熟知原生才能讓我們應(yīng)對(duì)各種各樣的需...
    俗三瘋閱讀 284評(píng)論 0 1
  • 基本概念 事件是一些特定動(dòng)作發(fā)生時(shí)所發(fā)出的信號(hào),JavaScript中的事件是可以被 JavaScript 偵測(cè)到...
    Zd_silent閱讀 453評(píng)論 0 1
  • JavaScript事件是由訪問(wèn)Web頁(yè)面的用戶引起的一系列操作逗柴,例如:用戶點(diǎn)擊。當(dāng)用戶執(zhí)行某些操作的時(shí)候顿肺,再去執(zhí)...
    輕思維閱讀 431評(píng)論 0 7
  • 一屠尊、事件的添加方式 on的方式:此方法給同一元素綁定兩次事件旷祸,前面的事件會(huì)被覆蓋,事件處理機(jī)制為事件冒泡讼昆。 如:d...
    XZ陽(yáng)光小熊閱讀 657評(píng)論 0 2
  • 清心寫(xiě)作訓(xùn)練30天第5天 女孩全身痙攣托享,痛苦不堪,她就是攜帶喪尸病毒攜帶者浸赫,只見(jiàn)她死去后突然醒來(lái)闰围,瞳也變成了灰色,...
    芷水中銀三星閱讀 493評(píng)論 2 4