質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

155閲覧

動的に追加された要素にイベントを指定した際の挙動について

HiromuNakajima

総合スコア10

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/10/25 04:35

jQueryの仕様について質問です。

下記サイトの「なぜ上級者向けのイベント構文を覚えないといけないのか?」の項目で、
以下の通りの説明がありました。

jQuery入門 設計力を学ぶデザインドリル|イベント(1)

なぜ上級者向けのイベント構文を覚えないといけないのか?

初心者向けのイベント構文は、動的な要素(プログラムで後から追加された要素)に対応していません。
そのため、インタラクティブなコンテンツでは対応できない場合があるのです。
このサンプルではイベントの処理はdiv要素をクリックしても「click!」と表示されません。

実際に動作テストも行いましたが、確かに.appendToイベントで追加されたdiv要素をクリックしても、
「click!」と表示されず、.textイベントが動作していないことを確認しました。

しかしながら、HTMLのbody内に最初からdiv要素が存在していた場合、
最初から存在してdiv要素をクリックする事で、.appendToイベントで追加されたdivに対しても、.textイベントが動作します。

仕様上の問題だと思いますが、ちょっとここの仕様が思うように呑み込めず、
ググっても詳細について明確な回答が拾えなかったので、
誰か詳しい方の解説をいただきたく質問しました。

▼初心者向けのイベント構文

jQuery

1$("div").click(function (){ 2 $("div").text("click!"); 3 }); 4 $("<div>").appendTo("body");

HTML

1<!DOCTYPE html> 2<html lang="jp" dir="ltr"> 3 4<head> 5 <meta charset="utf-8"> 6 <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script> 7 <link rel="stylesheet" href="test.css"> 8 <script src="test.js" charset="utf-8"></script> 9 <title></title> 10</head> 11 12<body> 13 14</body> 15 16</html> 17


bodyに既存のdivがない場合

bodyに既存のdivがある場合

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

仕様上の問題だと思いますが、ちょっとここの仕様が思うように呑み込めず、

ググっても詳細について明確な回答が拾えなかったので、
誰か詳しい方の解説をいただきたく質問しました。

$('div')は、それを実行した時点で存在する<div>要素を拾います。

外側でイベントをセットするときに使った$('div')は、ページロード時点で存在したものだけになりますし、クリックイベントの中の$('div')は、クリックした時点で存在するものを拾います。

投稿2019/10/25 04:42

maisumakun

総合スコア145123

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HiromuNakajima

2019/10/25 06:43

回答ありがとうございます! とても分かりやすい回答でした。 イベントセット時の$("div")はページロード時点で存在したものだけを拾うのはわかっていたのですが、 イベントセット時の$("div")で拾ったdiv要素を、クリックイベント内の$("div")に、 そのまま使いまわしているものと変な勘違いをしておりました・・・。 変な認識を早めに払拭できて助かりました。 基本的なオブジェクト構造を少し理解できたように感じます。 本当にありがとうございました。
guest

0

どこで引っかかっているかわかりませんが
特定のセレクタに機能をつけてもあとから追加したら反映されないのは理解できませんか?

対策はonで上位のタグから参照するだけです

  • ダメな例

div2は反応しない

javascript

1<script> 2$(function(){ 3 $('div').on('click',function (){ 4 $(this).text("click!"); 5 }); 6 $('<div>div2</div>').appendTo('body'); 7}); 8</script> 9<div>div1</div>
  • 正しい処理

div2も反応する

javascript

1<script> 2$(function(){ 3 $('body').on('click','div',function (){ 4 $(this).text("click!"); 5 }); 6 $('<div>div2</div>').appendTo('body'); 7}); 8</script> 9<div>div1</div>

投稿2019/10/25 04:47

yambejp

総合スコア114585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HiromuNakajima

2019/10/25 07:17

回答ありがとうございます! 質問時は、イベントセット時の$("div")で拾ったdiv要素をクリックイベント内の$("div")に、 そのまま使いまわしているものと変な勘違いをしておりました・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問