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

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

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

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

Q&A

解決済

3回答

10236閲覧

Jqueryのセレクタで変数を使用する場合

SugiuraY

総合スコア317

jQuery

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

0グッド

0クリップ

投稿2018/03/21 07:52

編集2018/03/21 08:05

Jqueryでセレクタで変数を使用する場合、+演算子で問題ないとの記事を見つけたのですが、
うまく利用することができません。
また、logにも特にエラーが出力されないのですが、どの点に問題があるのか、お力添えをお願い申し上げます。

Javascript

1変数を使用せずに作動するケース⬇︎ 2 $('#kozo').on('DOMSubtreeModified propertychange', function() { 3 $('#kozo > div:eq(0)').attr('id','kozo_div'); 4 }); 5 6変数をセレクタに使用してうまく作動しない⬇︎ 7$(document).ready(function() { 8 var add_div=['kozo','chikunensu','sokosu','sokaisu','shozaikaisu']; 9 for (var i = 0; i < add_div.length; i++) { 10 $(`#${add_div[i]}`).on('DOMSubtreeModified propertychange', function() { 11 $(`#${add_div[i]}> div:eq(0)`).attr('id',`#${add_div[i]}_div`); 12 }); 13 } 14}); 15

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

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

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

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

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

kei344

2018/03/21 07:54

コードが切れています。再現可能な形に直されることをお勧めします。
SugiuraY

2018/03/21 08:05

ご指摘ありがとうございます。再現可能なコードに修正をいたしました。
guest

回答3

0

onの中身はイベントが起きてから実行されるので、その時点でiループを抜けきった後の値になっています。なので、何らかの対応が必要です。

javascript

1// onの中身だけ 2$('#'+add_div[i]).on('DOMSubtreeModified propertychange', function() { 3 $(this).children('div').eq(0).attr('id',add_div[i]+'div'); 4});

投稿2018/03/21 07:56

編集2018/03/21 07:56
maisumakun

総合スコア145184

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

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

SugiuraY

2018/03/21 08:36

コメントをいただき、ありがとうございます。 先にiがループしてしまった、onの中身の処理はそのあとに実行されてしまうと言う整理ですね。DOMSubtreeModified propertychange(要素の変更の監視)がonを使用せざる得ないため、ここを変更することができず、「jquery on for ループ」等で検索しても良いものが出てこないのですが、何か検索等のヒントがあればアドバイスをいただくことはできますでしょうか。 たびたび恐縮ですが、よろしくお願い申し上げます。
maisumakun

2018/03/21 08:40

onでの登録はその場で行われるので、iを利用しても問題ありません。中身だけ工夫すれば回避できます。
SugiuraY

2018/03/21 09:32

コメントありがとうございます。 理解することができましたと嘘をつくことができず、どうしても何が起きているのかがわからずに、現状八方調べている状況す。 ('selector').on.( $('#'+add_div[i]).on('DOMSubtreeModified propertychange', function() { $(this).children('div').eq(0).attr('id',add_div[i]+'div'); }); ) という意味で”中身”と仰って頂いているのでしょうか。正直に申し上げますと、中身がどの部分をさしていらっしゃっていて、当初の提示させていただいたコードの中身のどこの部分が問題があって、iのループが抜けてしまっているのかが理解することができません。。 もちろん、私のわがままに付き合っていただき、ご回答に時間を割いて頂いているのは承知の上ですが、許されるのであれば、最後にお尋ねさせてください。 よろしくお願い申し上げます。
defghi1977

2018/03/21 09:38

「イベントリスナ ループ」で検索してみると良いよ. この問題はJavaScriptの有名な落とし穴の一つ.
SugiuraY

2018/03/21 10:01

ズバリという記事がたくさん出てきました!私もまんまと落とし穴に嵌ってしまったのですね。。 先人たちがたくさん、残してくださっていて勉強になります。 本当にお力添えに感謝を申し上げます。 よろしくお願いいたいます。
guest

0

とりあえず置き換えてみました。

js

1 var add_div=['kozo','chikunensu','sokosu','sokaisu','shozaikaisu']; 2 $.each( add_div, function( i, val ){ 3 $( '#' + val ).on( 'DOMSubtreeModified propertychange', function() { 4 $( '#' + val + '> div:eq(0)').attr( 'id','#' + val ); 5 } ); 6 }

【jQueryのeach()メソッドの基本的な使い方 | UX MILK】
http://uxmilk.jp/45120

【【jQuery】複数の要素に対して繰り返し処理をする(each・for) - TASK NOTES】
http://www.task-notes.com/entry/20140725/1406216933

【jQuery.each() | jQuery API Documentation】
http://api.jquery.com/jquery.each/

投稿2018/03/21 08:53

編集2018/03/21 10:10
kei344

総合スコア69407

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

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

SugiuraY

2018/03/21 09:53

コメントをいただきありがとうございます。 ご提示のコードで実現することができました。 eachメソッドで処理させれば、for文で使用するような、変数の問題が生じない点は興味深いところです。 構造文としてのforとメソッドとしてのeachのどのような違いでこのような相違が生じるのか、その理由を勉強してみようと思います。
kei344

2018/03/21 10:10

ヒント:スコープ と書こうとして「'#' + add_div」を「'#' + val 」におき直していないことに気づいた。修正します。
SugiuraY

2018/03/21 12:04

ご丁寧に修正をいただき、ありがとうございます。 よろしくお願い申し上げます。
guest

0

ベストアンサー

カウンタの宣言をvarからletに変えたら如何でしょう?

JavaScript

1$(document).ready(function() { 2 var add_div=['kozo','chikunensu','sokosu','sokaisu','shozaikaisu']; 3 for (let i = 0; i < add_div.length; i++) { 4 $(`#${add_div[i]}`).on('DOMSubtreeModified propertychange', function() { 5 $(`#${add_div[i]}> div:eq(0)`).attr('id',`#${add_div[i]}_div`); 6 }); 7 } 8});

NOTE:
mutation eventsは現在非推奨なので, 代わりにMutationObserverの利用も検討して下さい.

投稿2018/03/21 08:47

defghi1977

総合スコア4756

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

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

SugiuraY

2018/03/21 09:50

コメントありがとうございます。 ご呈示のコードで、処理を実行することは実現しました。 また、letを使うとブロックスコープ化することができることを調べることができました。 ヒントのようなものを見つけることができたのですが https://ginpen.com/2017/12/02/var-let-const/ このように、on以下が実行される前にループが終了してiは最後の変数値を代入してしまうため、イメージしているようなi=0 ⇨処理実行 i=1⇨処理実行という処理の流れになっていないということなのでしょうか。 一方letを変数宣言に利用することで、ブロックスコープ化することで、そのループ内でのみ変数が固定されて使用されるため、結果的に実行する処理と対応する変数が一致しているというイメージなのでしょうか。 よろしくお願い申し上げます。
defghi1977

2018/03/21 10:00

その認識で合っています. 「functionの実行時にどのiを探しに行くのか?」が問題の本質です. for(var i ...){}でカウンタを定義すると「変数定義の巻き上げ」により, i はfor文の外でも有効となります. この状態で非同期にリスナ関数function(){i}が呼び出されると, このfor文の外のi(のループ完了後の値)を参照することとなます. for(let i ...){}でカウンタを定義すると, ループ毎にブロックスコープが生成され, その都度変数iが(カウントアップしつつ)作られます. この状態で非同期的にリスナ関数function(){i}が呼び出されると, ループ毎に異なる変数iを参照することとなります.
SugiuraY

2018/03/21 10:13

最後まで、お付き合いをいただき、ありがとうございます。 殆ど、問題の核心に迫ることができました。あとは自分で調べてサンプルコードを書いてみながら、十分に理解することができそうです。 defghi1977様を初め、皆様のご協力に改めて深謝を申し上げます。 よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問