JavaScript 第4回 onClickとaddEventListenerを両方設定したら？

# はじめに
[JavaScript 第2回 onclickでボタン押下動作](https://qiita.com/Mount/items/edce7c91f5c96d793030)
[JavaScript 第3回 addEventListenerでボタン押下動作](https://qiita.com/Mount/items/32c6b03ee2acf079d04f)
を試したところ、onclickとaddEventListenerを両方設定したらどちらが優先されるのかなというのが気になりまして、試してみたいと思います。
今回は、Microsoft Edgeで検証しますが、Microsoft EdgeはChromiumベースであるため、Google Chromeでも同じ動作になるだろうと想像しています。
両方設定する場合動作についてはざっくり調べただけでは特に見つからなかったのですが、実装依存なのか、定義されているのかわかりませんでした。
そのため、今回の結果は、実際に検証した結果であって、他のブラウザや将来のMicrosoft Edgeでも同じ動作になるかはわかりません。
でも、普通に考えて両方設定することはないと思いますので、ただの興味です。

# 今回実施する内容
HTMLのボタンにonclick属性とaddEventListenerメソッドを付加し、クリックしたときにそれぞれ違う関数を実行します。
関数では同じpタグの文字を書き換えるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405480/65930389-fcde-0565-3302-a2e6e54b2a8f.png)

また、１つのボタンに２つのaddEventlistenerメソッドを付加し、それぞれ違う関数を実行し、両方とも動作するかを確認します。

# ソースコード(Git Hub)
https://github.com/Build-Mount/JS_04_onclickAddEventListener
- onclickAddEventListener.html
- onclickAddEventListener.js

# 環境
OS: Windows 11 JP (64bit)
Microsoft Edge: バージョン 119.0.2151.58 (公式ビルド) (64 ビット)

# 参考
[JavaScript 第2回 onclickでボタン押下動作](https://qiita.com/Mount/items/edce7c91f5c96d793030)
[JavaScript 第3回 addEventListenerでボタン押下動作](https://qiita.com/Mount/items/32c6b03ee2acf079d04f)

# 用語

# 結論
|検証概要|結果|
|:--|:--|
|onClickとaddEventListener両方|addEventListener優先|
|addEventListener複数|設定可能|


# ボタンにonclick属性とaddEventListener2つを設定し、ボタンを押して関数を実行
## サンプルプログラム
### onclickAddEventListener.htmlのソース
```html:onclickAddEventListener.html.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>addEventListener</title>
	<script src="onclickAddEventListener.js" defer></script>
</head>
<body>
    <input id="btn" type="button" value="実行" onClick="btnOnClick()">
    <br>
    結果：onclickとaddEventListenerの両方
    <p id="output"></p>
    結果：onclickのみ
    <p id="output2"></p>
    結果：addEventListenerのみ
    <p id="output3"></p>
    結果：addEventListener2つ目
    <p id="output4"></p>
</body>
</html>
```

### onclickAddEventListener.htmlの説明
- ヘッダー部のscriptタグには、`onclickAddEventListener.js`のスクリプトを設定する。
- inputタグで、「実行」のボタンを作成する。onclick属性で`onClick="btnOnClick()"`を設定します。
- pタグは、結果を表示するために4つ用意します。
  - 1つ目は、onclickとaddEventListenerを両方設定したときの確認用で、idタグを`id=output`とします。
  - 2つ目は、onclickのみを設定したときの確認用で、idタグを`id=output2`とします。
  - 3つ目は、addEventListenerのみを設定したときの確認用で、idタグを`id=output3`とします。
  - 4つ目は、2つ目のaddEventListenerを設定したときの確認用で、idタグを`id=output4`とします。

### onclickAddEventListener.jsのソース
```javascript:onclickAddEventListener.js
document.getElementById("btn").addEventListener("click", btnClick);
document.getElementById("btn").addEventListener("click", btnClick2);
function btnClick() {
    document.getElementById("output").textContent = "addEventListener";
    document.getElementById("output3").textContent = "addEventListener";
};

function btnClick2() {
    document.getElementById("output4").textContent = "addEventListener2つ目";
};

function btnOnClick() {
    document.getElementById("output").textContent = "onclick";
    document.getElementById("output2").textContent = "onclick";
};
```

### onclickAddEventListener.jsの説明
- `document.getElementById("btn").addEventListener("click", btnClick);`
`onclickAddEventListener.html`に記載したinputタグの`id=btn`に、addEventListenerメソッドを実装します。
addEventListenerの引数には、`"click", btnClick`としました。
inputタグをクリックしたときにbtnClick関数を実行します。
- `document.getElementById("btn").addEventListener("click", btnClick2);`
上記と同じボタンに、2つ目のaddEventListenerを追加します。
- `function btnClick()`関数は、pタグのoutputとoutput3に「addEventListener」を設定します。
- `function btnClick2()`関数は、pタグのoutput4に「addEventListener2つ目」を設定します。
= `function btnOnClick`関数は、pタグのoutputとoutput2に「onclick」を設定します。

### 結果確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405480/65930389-fcde-0565-3302-a2e6e54b2a8f.png)
- 結果としては、画面の通りで、onclick属性とaddEventListenerでは、addEventListenerが優先されました。
onclickはonclickで動作はしているようで、pタグのoutput2では結果は出ています。
Visual Studio Codeでデバッグしながら確認したところ、やはりonClick属性の関数が先に動作し、そのあとでaddEventListenerの関数が動作しており、優先というよりは、addEventListenerの関数で上書きをしている動作でした。
また、addEventListenerについては、`document.getElementById("btn").addEventListener`を記載した順番に動作するようです。したがって今回は`btnClick`の次に`btnClick2`が動作します。
- addEventListenerを複数設定する動作も問題なく、動作しました。

# おわりに
onClick属性とaddEventListenerの同時設定、および、複数のaddEventListenerの設定の動作を確認しました。
onClick属性とaddEventListenerの同時設定は使わないだろうな・・・
複数のaddEventListenerの設定も使うかどうか、1つのボタンで全く関数を実装したいということがあればするかもしれないなというところでしょうか。