お疲れ様です。あーやと申します。
今回、バインドというのものを知りました。
アコーディオンメニューのクリック時の開閉がうまくいく⇀もう一回クリックするとうまくいかない⇀それ以降はクリックするとうまくいく
このような現象に初めて会い、ChatGPTに聞いて解決したのですが、下記のような回答でした。
おそらく、クリックイベントが正しくバインドされておらず、2回目のクリックで正常に動作しないため、その後のクリックで正常に動作するという問題が発生している可能性があります。これは、イベントが再度バインドされることで解決できます。
バインド(bind)とは、イベントとそのイベントを処理するための関数を結びつけることを指します。要素に対して特定のイベント(例:クリック、マウスオーバーなど)が発生した際に、それに対応する処理を行うためには、イベントと処理をバインドする必要があります。
JavaScriptやjQueryなどの言語やライブラリでは、
ChatGPTよりaddEventListener
やon
メソッドを使用してイベントをバインドします。
これだけでは理解が深まらなかったので、調べてみました。
bindとthisの関係
「バインド js」などで検索すると、
bind関数というものがある事
this(実際今回うまくいかなかったのもthisを使用しておりました)と関連がある事がわかりました。
bindメソッドと使うと、thisの値を固定化し、thisや引数を新しい関数へ紐付けができるようになります。
引用元:https://tcd-theme.com/2021/12/javascript-bind.html
call/applyメソッドと似たような役割がありますが、まずは、「thisを束縛して新しい関数を作るのがbindメソッド」と覚えておくと良いでしょう。
参考サイト:
https://reffect.co.jp/html/javascript-bind
https://tcd-theme.com/2021/12/javascript-bind.html
addEventListener() について
イベントリスナーはクリック時等のイベントの際に処理をバインドしてくれるもの…なのかなと調べた結果思いました。
(もう少し勉強を進めないと、言語化が難しい所だなと思いました。自信がない言い回しとなり恐縮です)
addEventListener() は EventTarget インターフェイスのメソッドで、ターゲットに特定のイベントが配信されるたびに呼び出される関数を設定します。
https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener
ユーザが「ある要素をクリックした」とか「マウスカーソルを動かした」とか「キーボードで何か入力した」
といった様々なイベントが発生します。これらのイベントが発生した際に、なにかしらの処理をさせたい場合、
https://shironeko.hateblo.jp/entry/2018/06/16/122816
イベントに処理を「バインド」してあげる必要があります。
参考サイト:
https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener
https://shironeko.hateblo.jp/entry/2018/06/16/122816
調べた結果、今回の問題に照らし合わせてみた
バインドしなかった=つまり、thisを固定化できていない、紐づけがうまくされていない
バインドしていなく、複数あるアコーディオンメニューのクリックイベントがうまく動かなかった。そのため、バインドさせる必要があり、イベントリスナーを使用してバインドさせることでthisの固定化、紐づきがうまくいきイベントがクリック時に動くようになった。
js、jQueryともにまだまだ学習が必要だなと感じました。ただ、同時に理由がわかるととても便利で面白いものです。
うまく使いこなせるようになると、お客様のご期待に添える範囲も広がりますし、引き続き学習したいと思います!
最後までお読みいただきありがとうございました。