質問: 入力フォームを作成しました。 radioボタンにjQueryを使ってイベントを登録し ページを読み込んだ後に動かそうとしています。 ``` メール1 メール2 ``` このやり方だとradioボタンのイベントはどうにも動いてくれません。 ちなみにalert('test')は表示されるのでコードは動いていますしエラーにもなっていません。 悩んだ末にイベントを登録した直後だと動くことがわかりました。 ``` メール1 メール2 ``` 質問しようと試しているうちに解決してしまったのですが 最初の書き方だとなぜイベントが動かないのかわかりません。 同じ$(function)内に書かないとイベントが発火しないものでしょうか? jqueryのバージョンはLaravelに同梱されていた3.2.1です。
回答: 簡潔に述べると、**jQuery関数でラップした処理とそうでない処理の実行タイミングは異なる**んです。 以下、検証コード。 ``` メール1 メール2 ~ ~ ~ //最後にイベントを発火させようとしている ``` 質問文の「うまくいかないコード」に若干の修正を加えています。 一番大きな違いは、**イベントを発火させるコードをjQuery関数 $() でラップしている**ことです。 各処理の前後でコンソールに数字が出力されます。出力順を追ってみてください。 上側のイベント登録処理はonloadの処理が終わった後に実行されています。 (logは`10,20,10010,40,50`の順) なので、onload時にイベント発火処理を書いても何も起こらないのです。イベント登録処理前にすでに発火しちゃってるから。 で、このイベント発火処理を$()でラップすると、ラップしたブロックがイベント登録処理の後に実行されていることがわかります。 (logは`10,20,40,50,10010,100`) jquery内の詳しい挙動はさすがにわからないのですが、イベント発生順を内部でよしなに整理してくれているのかもしれません。そのあたりは有識者求ム。 なお、イベント登録部分とイベント発火部分の記載順を逆にしても、期待通りに動きます。