0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaScript イベントの実行順序を早める方法

Posted at

キャプチャリングフェーズを使うべし

キャプチャリングフェーズとは何か

キャプチャリングフェーズを理解する前に、まずはバブリングフェーズを理解する必要があります。

test.html
<form onclick="alert('form')">
  <div onclick="alert('div')">
    <p onclick="alert('p')"></p>
  </div>
</form>

バブリングフェーズとは、例えば、上記のようにform > div > p
の順番で要素が入れ子になっていた場合、p要素を押下すると、アラートは

  1. p
  2. div
  3. form

の順番で実行されます。
泡のようにイベントが内部の要素から親に向かって実行されていくので、バブリングフェーズと呼ばれています。
何もしないとイベントは基本的にバブリングフェーズに登録されます。

キャプチャリングフェーズはその逆で、親要素から内部に向かって実行されるフェーズのことを言います。

  • バブリングフェーズに登録されたイベントより、キャプチャリングフェーズに登録されたイベントの方が早く実行される

上記の特性を利用して、イベントを早めることが出来ます。
キャプチャリングフェーズを使用するには、addEventListenerの第二引数にtrueを渡すだけです。

addEventListener(event, true)

キャプチャリングフェーズを使ってみよう

まずは、キャプチャリングフェーズを使っていない場合

test.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
</head>
<body>
    <p style="height:300px; width:300px; background:red;" id="P"></p>
</body>
</html>
<script>
document.getElementById('P').addEventListener('click',function() {
  	alert("1個目のP")
})
document.getElementById('P').addEventListener('click',function() {
  	alert("2個目のP")
})
</script>

上記をそのまま実行すると、「1個目のP」が先に実行されて、その後に「2個目のP」が実行されています。
無題.png
無題2.png

では、キャプチャリングフェーズを使用した場合はどうなるのか
「2個目のP」のイベントをキャプチャリングフェーズに登録します。

test.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
</head>
<body>
    <p style="height:300px; width:300px; background:red;" id="P"></p>
</body>
</html>
<script>
document.getElementById('P').addEventListener('click',function() {
  	alert("1個目のP")
})
document.getElementById('P').addEventListener('click',function() {
  	alert("2個目のP")
}, true)
</script>

無題.png
無題2.png

今度は、キャプチャリングフェーズに登録された「2個目のP」のイベントの方が先に実行されています。

上記のことから、バブリングフェーズよりキャプチャリングフェーズを利用したほうが、イベントが早く実行されることが分かりました。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?