
「jQueryのon("click")とclick()の違い」についてQiitaにて調べていたのですが、いまいち分からず質問させて貰いました。
$(document).ready(function () { $(document).on("click", ".click_button", function(){ console.log("clickされたよ!"); }); });
こちらの「on」が指定された場合のコードについて、「「特定のクラスが指定されたDOM」から「Documentそのもの」に対してイベントが登録されたことになる(はず)。」」とあるのですが、Documentそのものを指定した場合、非同期などで、HTMLを新しく生成した場合でもイベントが発火するといった仕組みが分かりません。
「Documentそのもの」といった部分もあまりピンとこない為、ご説明頂けましたらありがたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
なんでQiitaの記事を読みながらウンウン唸ってるんですか?
作った人に聞くのが一番に決まってるでしょう。
というわけで、間違いのないjQuery公式ドキュメントです。
せめてこれらを頭に叩き込んでください。
えっ、英語は辛い? しょうがないなぁ…
でしたら日本語訳のドキュメントも存在します。
バージョン1.9?古すぎじゃね?何のやくにたつんだと思うかもしれません。
ですがjQueryは後方互換に優れてたライブラリなので、
バージョンは古くても思想自体はほとんど変化しておらず使えます。
英語が辛いなら、まずはこっちをしっかり読んでください。
内部のロジックは結構変化していますが、使い方という面ではほとんど変わってないはずです。
以下リファレンスからの抜粋
.click( handler )
This method is a shortcut for.on( "click", handler )
in the first two variations
この.click(handler)
という機能は、
.on("click", handler)
という書き方のショートカットとして用意されたものです。
はい「jQueryのon("click")とclick()の違いについて」のタイトル回収が出来ましたね。
.on
の方はバブリングで捕まえるという使い方も用意されていますが、
.click
にはバブリングで子孫の要素でのクリックを捕まえるという機能は存在しないので、凝った事がしたければ.on
を使うしかありません。
ほとんどの主要なブラウザでは、イベント伝搬(バブリング)は要素の一番内側から、BODYに向かっていきます。 ただし、IE8以下のバージョンでは一部のイベント(changeやsubmit)でこれらの動作とは違った動きをしますが、 jQueryがこれらの違いを内部的に正しています。
セレクタ引数を省略、またはnullを指定するとイベントハンドラは選択された要素を直接参照するようになります。 その選択要素でのイベント発生、または子孫要素でのイベント伝搬でイベントハンドラが実行されるようになります。 セレクタが指定されれば、選択要素を直接参照するのはなく、delegateのようにそのセレクタにマッチした部分でイベントが発生した場合に イベントハンドラを実行するようになります。
こちらは日本語ドキュメントの方からの抜粋です。
理解する為に必要な「バブリング」という単語が出てきましたね。
バブリングがなんぞやというのは他の回答者さんから解説がいくつも出てるので割愛します。
というわけで、
こういったライブラリは使い方説明書が公式から出ているので、
公式の使い方説明書読めよという話です。
実際には読んでもわからなかった……というケースが多いと思いますが、
何十回でも何百回でも一応目を透してみるだけでも、
半年、1年後には脳死しているだけの同じ位の実力のエンジニアと比べて2段階も3段階も優れたエンジニアになるはずです。
投稿2019/08/09 06:13
総合スコア21412
0
まず大前提として理解してほしいことに、イベントのバブリングというものがあります。ある要素でclick
イベントが発生すると、その要素自身だけではなく、親要素、さらにその親要素、…、<body>
、<html>
、window
、document
と各所でclick
イベントのハンドラが動くのです。
document.on('click')
とした場合、これを利用して、下で起きたclick
イベントをdocument
でまとめて拾うことができます。.click_button
の条件は、実際にクリックされた時にチェックされるので、イベントセット時にボタンがあろうがなかろうが無関係です。
投稿2019/08/09 04:37
総合スコア146581
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。


退会済みユーザー
2019/08/09 10:44

退会済みユーザー
2019/08/09 11:15

退会済みユーザー
2019/08/09 11:19 編集

0
Documentそのものを指定した場合、非同期などで、HTMLを新しく生成した場合でもイベントが発火するといった仕組みが分かりません。
これは色々とパターンを作って動かしてみると理解が深まるかもしれません。
基本的に既に生成されたHTMLから指定の要素を探し出してイベントを登録します。
つまり、$(document).ready(function () {
を指定していない場合、
下記のような記述になっているとイベントは登録されません。
ので、クリックしても動きません。
html
1<script> 2$('.click_button').on('click', function(){ 3 console.log("clickされたよ!"); 4 }); 5</script> 6 7<button type="button" class="click_button">click</button> 8
それをこうした場合、
html
1<script> 2 $(document).on("click", ".click_button", function(){ 3 console.log("clickされたよ!"); 4 }); 5</script> 6<button type="button" class="click_button">click</button>
イベントはdocument自体に登録されているので、HTMLが生成されきっていなくても、イベントは登録され、onの第2引数に指定されたselectorに反応してイベントが作動するようになります。
じゃあ、documentって何なのよとなるとそれこそドキュメントを確認しましょう。
Document インターフェイスはブラウザーに読み込まれたウェブページを表し、 DOM ツリーであるウェブページのコンテンツへのエントリーポイントとして働きます。 DOM ツリーは <body> や <table> など、多数の要素を持ちます。これはページの URL を取得したり文書で新たな要素を作成するなど、文書全体に関わる機能を提供します。
要は「HTML本体」(意訳)と言い換えても良いかもしれません。
なので、後から動的に要素が追加されようと、HTML本体内部で追加される出来事なので、イベントはきちんと登録されて実行可能である ということになります。
投稿2019/08/09 04:42
総合スコア80888
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
このような記述があったと仮定します。
これで、body
に追加された要素にクリックイベントは登録され…ません。
html
1<html> 2<head> 3 <script> 4 $(document).ready(function () { 5 $(".click_button").click(function(){ 6 console.log("clickされたよ!"); 7 }); 8 9 $("body").append($("<div>",{ 10 class: "click_button" 11 })); 12 }); 13 </script> 14</head> 15<body> 16</body> 17</html>
.click_button
を持つDOM要素に対してクリックイベントを登録した後で.click_button
を持つDOM要素を追加したからです。
後から追加したDOM要素に対しても自動的にクリックイベントを登録したい場合はそのセレクタからではなく、documentのjQueryオブジェクトからonイベントを呼びます。
$(document).ready(function () { $(document).on("click", ".click_button", function(){ console.log("clickされたよ!"); }); $("body").append($("<div>",{ class: "click_button" })); });
投稿2019/08/09 04:36
編集2019/08/09 04:41総合スコア2663
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
イメージ的にはこんな感じですね
javascript
1<script> 2document.addEventListener('click',e=>{ 3 if([].indexOf.call(document.querySelectorAll('.click_button'),e.target)>=0){; 4 console.log(e.type); 5 } 6}); 7</script> 8<input type="button" value="click" class="click_button">
documentにイベントを付加して、そのうちの特定セレクタに合致したとき処理する
投稿2019/08/09 04:46
総合スコア117726
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。