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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

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

Q&A

解決済

3回答

2979閲覧

Javascript: 動的にdocument.getElementByIdを生成する方法

nanase21

総合スコア144

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

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

0グッド

1クリップ

投稿2019/08/31 07:11

編集2019/08/31 08:52

js

1 let price_itme = $('#plan').children().length; 2 //=> 要素が2つの時、document.getElementByIdを2つ生成したい 3 for(let i=0;i<price_itme;i++){ 4 let dom1 = document.getElementById(`plan${i}`).style.display = "none"; 5 //let dom2 = document.getElementById(`plan${i}`).style.display = "none"; 6 }

実現したいこと

#planの配下にある、要素を取得して要素数分だけdocument.getElementByIdを生成したい。

困っていること
要素数分だけ、document.getElementByIdを生成する方法が分からない。

js

1let arr = []; 2for(let i=0;i<price_itme;i++){ 3 arr[i] = `document.getElementById(plan${i})`; 4} 5//=> ["document.getElementById(plan0)", "document.getElementById(plan1)"]

上記で、document. getElementByIdを生成することができました。
配列にdocumentを生成した場合、どのようにstyleを利かせばよいかご教示いただけると幸いです。

slim

1#plan 2 select#sample.form-control name="select" onchange="SendAjax(this);" 3 option value="plan" id="item" data-price="plan" 4 = 'item1' 5 option value="plan2" id="item2" data-price="plan2" 6 = 'item2' 7 option value="plan3" id="item3" data-price="plan3" 8 = 'item3' 9 10 input type="text" value="plan1" id="plan" 11 input type="text" value="plan2" id="plan1" 12 input type="text" value="plan3" id="plan2"

js

1//TODO: jsに書き換えたいな 2 var plan_item = $('#plan').children().length; 3 for(let i=0;i<plan_item;i++){ 4 //ここをどうにかしたい。 5 document.getElementById(`plan${i}`).style.display = "none"; 6 document.getElementById(`plan${i}`).style.display = "none"; 7 document.getElementById(`plan${i}`).style.display = "none"; 8 } 9 10 function SendAjax(obj) 11 { 12 // objはselectタグ 13 let idx = obj.selectedIndex; 14 let value = obj.options[idx].value // value 15 let text = obj.options[idx].text; // apper text 16 17 //ここもforで編集する予定 18 const txt1 = document.getElementById("item"); 19 const txt2 = document.getElementById("item2"); 20 const txt3 = document.getElementById("item3"); 21 22 23 if(value != txt1.id || value != txt2.id || value != txt3.id) 24 { 25 txt1.style.display = "none"; 26 txt2.style.display = "none"; 27 txt3.style.display = "none"; 28 } 29 if(value == txt1.id) 30 { 31 txt1.style.display = "block"; 32 } 33 if(value == txt2.id) 34 { 35 txt2.style.display = "block"; 36 } 37 if(value == txt3.id) 38 { 39 txt3.style.display = "block"; 40 } 41 42 console.log(`TEXT: ${text} / VALUE: ${value}`); 43 console.log(`txt_ID1: ${txt1.id}`); 44 }

#試していること
evalを使って、jsコードを生成しようとしたのですがシンタックスエラーになってしまいました。
もし原因についてお分かりでしたら、ご教示いただけると幸いです。

js

1for (var i = 0; i < 2; i++) { 2  eval("let arr" + i + "=" + "document.getElementById('" + `plan${i}` + "')" + ";"); 3} 4 5//=> arr0をすると下記のエラーになってしまいます。 6// VM546:1 Uncaught ReferenceError: arr0 is not defined 7// at <anonymous>:1:1

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

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

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

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

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

kei344

2019/08/31 07:38

HTMLも提示し、具体的に行いたい処理を提示されたほうが適切な回答を得れると思います。
Lhankor_Mhy

2019/08/31 08:06

もしかして、「生成」というのは言葉のあやではなくて、まだ存在しない要素を生成しようとしているとかですか? document. getElementById() は、すでに存在する要素を取得するメソッドですが、それは大丈夫でしょうか?
nanase21

2019/08/31 08:16

htmlタグは存在していますが、dbから取ってくるデータの数によって要素の数が変わるので、事前にlet item= document.getElementById(plan1);みたいに変数を作って置くことが出来ないです。 なので、lenghtで要素の数を取得して要素分だけforで回してdocument.getElementByIdを作ろうとしていました。
Lhankor_Mhy

2019/08/31 08:25

そうだとすると、元々のご提示のコードでも要素が消えるはずなんですよねえ…… といいますか、dbからのデータでhtmlタグを出力する際に style="display:none"みたいなことをしておいた方が話が早いような……?
nanase21

2019/08/31 08:27

該当箇所のコードをhtml(slim)も含めて全て載せました。 やりたいこととしては、初期表示ではinputの要素を全て隠して、selectで選択したオプションに応じて該当するinputだけを表示する処理をイメージしています。
Lhankor_Mhy

2019/08/31 09:29

とりあえず、maisumakunさんのコメントのとおり、配列には「document.getElementByIdの実行結果」を入れましょう。 evalとか必要ないです。 あとはループの範囲がおかしいのと、plan1が存在しないのが気になります。
nanase21

2019/08/31 09:47

変に変数を作ろうとせずにdocument.getElementById(id${i} == 比較するもの)で比較し、該当したらdocument.getElementById(`id${i}`).style.display = "none";をするようにして解決できました。
guest

回答3

0

jQuery を使用するならこれだけで消せると思いますよ。

js

1$( '#plan > [id^="plan"]' ).hide(); 2```**動くサンプル:**[https://jsfiddle.net/cv3o8t14/](https://jsfiddle.net/cv3o8t14/) 3 4--- 5 6【属性セレクタ - CSS: カスケーディングスタイルシート | MDN7[https://developer.mozilla.org/ja/docs/Web/CSS/Attribute_selectors](https://developer.mozilla.org/ja/docs/Web/CSS/Attribute_selectors) 8 9.hide() | jQuery API Documentation】 10[https://api.jquery.com/hide/](https://api.jquery.com/hide/)

投稿2019/08/31 07:56

kei344

総合スコア69400

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

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

0

回答依頼ありがとうございます。

気になる点が2点。

  • dom1 には "none" が入ってそうな気がします。
  • let はブロックスコープなので、for を抜けると参照できなくなりそうです。

生成自体はできていると思います。ただ、変数に納められていないと思いますので、適切に代入されてはいかがでしょうか。
ループを用いているので、配列に代入するのが無難なような気がします。

投稿2019/08/31 07:19

Lhankor_Mhy

総合スコア36074

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

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

0

ベストアンサー

要素が2つの時、document.getElementByIdを2つ生成したい

そのままで問題ないのではないかと思います。ループが回れば、price_itmeの数だけgetElementByIdがk\実行されます。

投稿2019/08/31 07:19

maisumakun

総合スコア145183

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

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

maisumakun

2019/08/31 07:19

(うまくいかないばあいは具体的に、どのようにうまく行かないのか書いていただければ幸いです)
nanase21

2019/08/31 07:43

質問に今できていることを追記しました。 配列にdocumentを入れた時にcssを効かす方が分からないです。 最終的なイメージとしては、デフォルトでは要素を非表示にして、selectで選択した項目に応じて表示する内容を変更したいと考えています。
maisumakun

2019/08/31 07:57 編集

「document.getElementByIdという文字列」を入れるのではなくて、配列には「document.getElementByIdの実行結果」を入れましょう。 (配列に入れていない元のコードでも、それぞれ取った要素に対してCSSが効いていると思うのですが、なにかおかしいのでしょうか)
nanase21

2019/08/31 08:29

質問に該当箇所のコードを全て載せました。 最終的にやりたいこととしては、初期表示ではinputの要素を全て隠して、selectで選択したオプションに応じて該当するinputだけを表示する処理をイメージしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問