JS Event Basics

JS DOM Event

  • 采用事件驅(qū)動(dòng)模式,任務(wù)的執(zhí)行不取決代碼的順序啸箫,而取決于某一個(gè)事件是否發(fā)生忘苛。

1. 事件冒泡Bubbling

1.1 Bubbling

When an event happens on an element, it first runs the handlers on it, then on its parent, then all the way up on other ancestors.

The process is called “bubbling”, because events “bubble” from the inner element up through parents like a bubble in the water.

就是如果事件發(fā)生在內(nèi)部子元素上扎唾,這個(gè)事件也會(huì)觸發(fā)父元素的該事件處理器。比如父元素有onclick = "myFunction()"扮宠,你沒按父元素但按了里面的子元素狐榔,父元素的myFunction()會(huì)被觸發(fā)運(yùn)行薄腻。這個(gè)被按的子元素是這個(gè)event的target,用event.target可以找到

function changeBgColor() {
      if (event.target.style.backgroundColor === "pink") {
        event.target.style.backgroundColor = "yellow";
      } else {
        event.target.style.backgroundColor = "pink";
      }
    }

1.2 Stop Bubbling

If we don't want the parent element handler to be triggered by child element, you can stop bubbling. ONLY stop bubbling if you really need it, otherwise bubbling is convenient.

不想讓子元素的事件冒泡上來罢艾,在該子元素上用method event.stopPropagation()

<div onclick = "myFunction()">
  <p onclick = "event.stopPropagation()">
    paragrah text.
  </p>
</div>

2. 事件捕獲Capture

如果說bubbling是從下往上咐蚯,那么capture就是從上往下春锋,從外層父元素一直到target所在的元素差凹。通常用on<event>這種格式,或者用addEventListener設(shè)置的handler呐萌,不執(zhí)行capture谊娇,只執(zhí)行bubbling邮绿。如果要讓他們執(zhí)行capture,要設(shè)置{capture: true}顾腊。

<body>
  <div>
    <p id="p1">
      <input type="button" id="captureDemo" />
    </p>
  </div>
  <script>
    var demo = document.getElementById("captureDemo");
    var p1 = document.getElementById("p1");
    demo.addEventListener("click", e => alert("Capturing demo"), true);
    p1.addEventListener("click", e => alert("Capturing p1"), true);
  </script>
</body>

上述例子中杂靶,由于p1和captureDemo都設(shè)置了capture:true,所以點(diǎn)button的時(shí)候吗垮,會(huì)先顯示"Capturing p1", 再顯示"Capturing demo"烁登,從外到內(nèi)。

3. 事件委托Event Delegation

翻譯成中文叫事件委托或者事件代理锨络。因?yàn)閑vent handler過多會(huì)影響頁面性能狼牺,把一些子元素的event handler統(tǒng)一放到他們的共同爸爸那里,減少handler數(shù)量掠归,能更快訪問虏冻。

The idea is that if we have a lot of elements handled in a similar way, then instead of assigning a handler to each of them – we put a single handler on their common ancestor.

In the handler we get event.target, see where the event actually happened and handle it.

4.事件監(jiān)聽后觸發(fā)函數(shù)的參數(shù)傳遞

When an event happens, your assigned function will be invoked, and the "event" will be the default first parameter of the function. 用addEventListener時(shí)兄旬,event是默認(rèn)形參余寥,就跟array.reduce(function(prev, curr) {})里面默認(rèn)傳prev悯森,curr一樣。

element.addEventListener("click", myFunction);
function myFunction() {};
element.addEventListener("click", function () {}); //里面第二個(gè)參數(shù)可以是直接的函數(shù)表達(dá)式或者一個(gè)函數(shù)名字祝蝠,函數(shù)內(nèi)容在外部定義
element.onclick = "myFunction()"绎狭; //這里加引號(hào)褥傍,里面直接調(diào)用函數(shù)運(yùn)行所以函數(shù)后面加括號(hào)

對(duì)于event則放在函數(shù)定義里面作為形參(符號(hào)無所謂),具體哪個(gè)event會(huì)作為實(shí)參傳進(jìn)來:

document.getElementById("myBtn").addEventListener("click", myFunction);
function myFunction(event) {
  document.getElementById("demo").innerHTML = "Hello World";
  alert(event.target); //這里event作為形參的話其實(shí)符號(hào)無所謂蹦狂,比如可以寫成function myFunction(e){alert(e.target);}, 反正到時(shí)候具體那個(gè)event會(huì)作為這個(gè)e被傳進(jìn)來
  
function myFunction() {
  document.getElementById("demo").innerHTML = "Hello World";
  alert(event.target); //這樣也work,因?yàn)閑vent直接綁定了窜骄,這里的event是固定符號(hào)。但最好還是寫上event傳遞邻遏,便于代碼閱讀

對(duì)于onclick = "functionName()"中党远,event也是默認(rèn)綁定富弦,可以不用傳。如果要傳遞济似,在onclick那句語句中以實(shí)參傳遞盏缤,函數(shù)定義的時(shí)候?qū)懮闲螀ⅰ?/p>

<button onclick="displayDate()">The time is?</button>

<script>
function displayDate() {
  document.getElementById("demo").innerHTML = Date();
  alert(event.target);
}
</script>
<button onclick="displayDate(event)">The time is?</button>

<script>
function displayDate(e) {
  document.getElementById("demo").innerHTML = Date();
  alert(e.target);
}
</script>

5.參考:

https://javascript.info/bubbling-and-capturing

https://javascript.info/event-delegation

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末台舱,一起剝皮案震驚了整個(gè)濱河市潭流,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌灰嫉,老刑警劉巖讼撒,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件根盒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡炎滞,警方通過查閱死者的電腦和手機(jī)厂榛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辈双,“玉大人,你說我怎么就攤上這事换衬≈ぐ牛” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)官硝。 經(jīng)常有香客問我,道長(zhǎng)傻咖,這世上最難降的妖魔是什么岖研? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任孙援,我火速辦了婚禮,結(jié)果婚禮上赃磨,老公的妹妹穿的比我還像新娘邻辉。我一直安慰自己值骇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布吱瘩。 她就那樣靜靜地躺著迹缀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪票摇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天盆色,我揣著相機(jī)與錄音隔躲,去河邊找鬼物延。 笑死,一個(gè)胖子當(dāng)著我的面吹牛浑吟,可吹牛的內(nèi)容都是我干的案训。 我是一名探鬼主播强霎,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼轩触!你這毒婦竟也來了脱柱?” 一聲冷哼從身側(cè)響起拉馋,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤煌茴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后矩乐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡分歇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年职抡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硫椰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖奕翔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情派继,我是刑警寧澤宾袜,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布庆猫,位于F島的核電站月培,受9級(jí)特大地震影響恩急,放射性物質(zhì)發(fā)生泄漏衷恭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一灭袁、第九天 我趴在偏房一處隱蔽的房頂上張望简卧。 院中可真熱鬧,春花似錦析校、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盖彭,卻和暖如春纹烹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背召边。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工铺呵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隧熙。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓片挂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親贞盯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子音念,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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

  • 在JavaScript中,一切都是對(duì)象躏敢。 使用深度優(yōu)先遍歷,element是一個(gè)DOM元素闷愤,selectors是一...
    garble閱讀 574評(píng)論 0 1
  • 聲明:本文來源于http://www.webzsky.com/?p=731我只是在這里作為自己的學(xué)習(xí)筆記整理一下(...
    angryyan閱讀 7,023評(píng)論 1 6
  • 以下文章為轉(zhuǎn)載蛾扇,對(duì)理解JavaScript中的事件處理機(jī)制很有幫助镀首,淺顯易懂芋齿,特分享于此觅捆。 什么是事件? 事件(E...
    jxyjxy閱讀 3,037評(píng)論 1 10
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,813評(píng)論 0 38
  • ??JavaScript 與 HTML 之間的交互是通過事件實(shí)現(xiàn)的涩蜘。 ??事件,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,495評(píng)論 1 11