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

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

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

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

JavaScript

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

Q&A

解決済

3回答

799閲覧

Perlで繰り返し処理を行う際のJavascriptの記述

bis_don

総合スコア18

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

JavaScript

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

0グッド

0クリップ

投稿2021/08/25 06:19

編集2021/08/25 06:22

前提・実現したいこと

Perlはある程度理解できるのですが、Javascriptはつい最近触り始めたばかりです。

「チェックボックスにチェックが入ると、対応のテキストエリアを非活性にしたい」と考え、
わからないなりに色々調べてみた所、動作自体は達成出来たのですが
Javascriptの記述がデータの数だけ同じ構文を増やす方法しかわかっていない状況です。

拙い内容で大変恐縮ですが、Javascriptをまとめる方法がございましたらご教示頂きたくお願い致します。

Perl側

Perl

1# @cntはその時々のデータ量で変動します 2my $cnt=@cnt; 3 4# html部分 5for(my $i=0; $i<$cnt; $i++){ 6 print "<p><input type=\"checkbox\" id=\"check${i}\"><input type=\"text\" id=\"text${i}\"></p>\n"; 7} 8 9# Javascript部分 10for(my $i=0; $i<$cnt; $i++){ 11 print "document.getElementById(\'check${i}\').onclick = function(){\n"; 12 print "if(check${i}.checked){\n"; 13 print "text${i}.disabled = true\;\n"; 14 print "}\n"; 15 print "else{\n"; 16 print "text${i}.disabled = false\;\n"; 17 print "}\n"; 18}

Javascriptのソースコード

Javascript

1document.getElementById('check1').onclick = function(){ 2 if(check1.checked){ 3 text1.disabled = true; 4 } 5 else{ 6 text1.disabled = false; 7 } 8} 9document.getElementById('check2').onclick = function(){ 10 if(check2.checked){ 11 text2.disabled = true; 12 } 13 else{ 14 text2.disabled = false; 15 } 16} 17// 以下check3用、check4用…とデータの数だけ続いてしまいます

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

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

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

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

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

guest

回答3

0

簡単に済ませるなら、Perlの最初のループで onchange="text$[i}.disabled=this.checked" をチェックボックスに足すだけでいいでしょう。

ちょっと洗練された手法は、1つだけイベントリスナを登録して、ノードの相対位置を利用して対応するテキストフィールドを見つけることです。例:

js

1document.addEventListener('change', e => { 2 if (e.target.type == 'checkbox') 3 e.target.nextSibling.disabled = e.target.checked; 4});

投稿2021/08/25 06:30

int32_t

総合スコア21599

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

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

bis_don

2021/08/25 08:21

詳しくありがとうございます! 早速それぞれの内容を調べて、少し意味が理解出来てきたところです。 相対位置を利用するというやり方は別の場所でも生かせそうで勉強になります。
guest

0

ベストアンサー

  • HTML要素にクラスをつけるてグルーピングする
  • idではなく相対位置で処理する

javascript

1<script> 2document.addEventListener('click',e=>{ 3 if(e.target.closest('.ch')){ 4 e.target.nextElementSibling.disabled=e.target.checked; 5 } 6}); 7</script> 8 9<p><input type="checkbox" id="check1" class="ch"><input type="text" id="text1"></p> 10<p><input type="checkbox" id="check2" class="ch"><input type="text" id="text2"></p> 11<p><input type="checkbox" id="check3" class="ch"><input type="text" id="text3"></p>

投稿2021/08/25 06:39

編集2021/08/25 06:40
yambejp

総合スコア116443

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

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

bis_don

2021/08/25 08:26

詳しくご提示頂きありがとうございます! まさに想定していた通りの挙動が出来たのでとても助かりました。 所で、非常に心苦しいのですが、宜しければもう一つだけお伺い出来ればと存じます。 質問を簡略化しようとして省いてしまったのですが、本来は二つのテキストエリアを非活性にしたかったのです。 <p><input type="checkbox" id="check1" class="ch"><input type="text" id="text1"><input type="text" id="sample1"></p> 自分なりに調べたところ、前の要素や親要素として参照するやり方がある事はわかったのですが、 このように次と次の次まで対応するにはどのように記述すれば宜しいでしょうか。
yambejp

2021/08/25 08:35

後ろ方向にすべて適用したいならこんな感じで <script> document.addEventListener('click',e=>{ const t=e.target; if(t.closest('.ch')){ let n=[...t.closest('p').querySelectorAll('input')]; n.filter((_,x)=>x>n.indexOf(t)).forEach(x=>x.disabled=t.checked); } }); </script> <p><input type="checkbox" id="check1" class="ch"><input><input></p> <p><input type="checkbox" id="check2" class="ch"><input><input></p> <p><input type="checkbox" id="check3" class="ch"><input><input></p>
bis_don

2021/08/25 08:42

度々のご回答、誠に恐縮です。 最初の件と合わせていずれも想定の通りの挙動で、とても勉強になりました。 今後の参考とさせて頂きます!
guest

0

htmlの関係性が分からないですが、「次、前の要素」「兄弟要素」などが取得できるので増やさなくても1ソースで対応可能です。
「チェックボックスから見たテキストエリアの位置」で辿ってください。

data属性を使い、idの命名に法則性を持たせれば要素の位置関係なく対応可能です。
(法則性持たせなくてもそのままテキストエリアのid入れても良いけど)

投稿2021/08/25 06:29

m.ts10806

総合スコア80875

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

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

bis_don

2021/08/25 08:18

ありがとうございます! data属性と言うものは詳しく存じ上げておりませんでした。 早速今後の参考に勉強させて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問