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

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

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

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

Q&A

解決済

2回答

700閲覧

複数のチェックボックスの値を取得した後、カンマの代わりに連番&特定の文字をセットで表示させたい

m_k

総合スコア1

jQuery

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

0グッド

0クリップ

投稿2022/09/02 10:33

javascriptは初心者のため、解決策ご存じの方いらっしゃったらよろしくお願いいたします。

複数のチェックボックスの値を取得した後、
①値をHTMLに入れる(例:リンゴ,バナナ,オレンジ)
②カンマの代わりに、特定の文字をいれる
→特定の文字にチェックボックスで選択された数を値の隣にいれたい
(例:no1=リンゴ&no2=バナナ&no3=オレンジ&no4=トマト)

実現したいこと

no1,2.3…(番号)を連番にしたいのですが、どうしても同じ数字になってしまい他の方法が思い浮かびません…

発生している問題・エラーメッセージ

リンゴ&no4バナナ&no4オレンジ&no4トマト&no4オレンジ

該当のソースコード

HTML

1<label><input type="checkbox" name="hoge" value="リンゴ" />リンゴ</label> 2<label><input type="checkbox" name="hoge" value="バナナ" />バナナ</label> 3<label><input type="checkbox" name="hoge" value="オレンジ" />オレンジ</label> 4<label><input type="checkbox" name="hoge" value="トマト" />トマト</label> 5<p class="result4"></p>

JS

1$(function(){ 2 $('input[name=hoge]').on('change', function(){ 3 var cnt = $('input[name="hoge"]:checked').length; 4 var vals = $('input[name=hoge]:checked').map(function(){ 5 return $(this).val(); 6 }).get().join('&prdno' + cnt); 7 $('.result4').text(vals); 8 }); 9});

よろしくお願いいたします。

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

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

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

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

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

yambejp

2022/09/02 10:36

「リンゴ」が「no1」だというのはどこを見て判断するのでしょうか?
guest

回答2

0

ベストアンサー

たとえば、バナナ とトマト がチェックされているときに、以下の2通りが考えられます。

(1) no1=バナナ&no2=トマト とする。

javascript

1$('input[name=hoge]').on('change', function(){ 2 const vals = $('input[name=hoge]:checked').map( 3 function(i) { return `no${i+1}=` + $(this).val(); } 4 ).get().join('&'); 5 6 $('.result4').text(vals); 7});

(2) no2=バナナ&no4=トマト とする。

javascript

1$('input[name=hoge]').on('change', function(){ 2 const vals = $('input[name=hoge]').map( 3 function(i) { 4 return $(this).prop('checked') ? `no${i+1}=` + $(this).val() : null 5 } 6 ).get().filter(e => e).join('&'); 7 8 $('.result4').text(vals); 9}); 10

追記1

質問のタイトルが

複数のチェックボックスの値を取得した後、カンマの代わりに連番&特定の文字をセットで表示させたい

となっており、「連番」とあることから(1) かなと思いましたが、(2) の可能性もある気がしたので両方回答しておきました。

追記2

もし要件が(2)である場合、すなわちクエリパラメータの値リンゴのキーはno1バナナのキーはno2というように決まっているのであれば、
HTMLの各 <input> の属性を下記に修正するのもよいかもしれません。

html

1<label><input type="checkbox" class="hoge" name="no1" value="リンゴ" />リンゴ</label> 2<label><input type="checkbox" class="hoge" name="no2" value="バナナ" />バナナ</label> 3<label><input type="checkbox" class="hoge" name="no3" value="オレンジ" />オレンジ</label> 4<label><input type="checkbox" class="hoge" name="no4" value="トマト" />トマト</label>

このようにしておき、また JavaScript のほうでは jQuery の toArray() を使って要素の配列にして、
配列の map() メソッドを使うことにすると、以下のようにコードをより短く書けます。

javascript

1$('.hoge').on('change', function(){ 2 const vals = $('.hoge:checked') 3 .toArray() 4 .map(e => `${e.name}=${e.value}`) 5 .join('&'); 6 7 $('.result4').text(vals); 8});

追記3

参考までに、URLSearchParams を使うと、キーと値を = でつなげたり & でジョインするといった煩雑な文字列処理をすることなくクエリパラメータの文字列が得られます。例として追記2に挙げたHTMLに対してクエリパラメータを作るコードを挙げておきます。

javascript

1$('.hoge').on('change', function(){ 2 const vals = new URLSearchParams( 3 $('.hoge:checked').toArray().map(e => [e.name, e.value]) 4 ); 5 $('.result4').text(vals); 6});

ただしURLSearchParams を使ってクエリパラメータの文字列を作った場合、URLエンコードされたものになります。

投稿2022/09/02 11:06

編集2022/09/02 16:00
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

m_k

2022/09/05 23:28

お礼が遅くなり申し訳ありません…! 様々なパターンでご回答いただきありがとうございます!! しっかりお伝えできていなかった部分でしたが、おっしゃる通り①のパターンを実装したかったのでとても助かりました。 さきほど取り急ぎ試してみたところ、問題解決いたしました! 自分では絶対に実装できなかったので、改めてゆっくりいただいた内容をみて勉強しようと思います;; ありがとうございました!
guest

0

とりあえず(1)はこんな感じです

javascript

1<script> 2document.addEventListener('change', e=>{ 3 const t=e.target; 4 if(t.matches('[type=checkbox]')){ 5 document.querySelector('.result4').textContent=[...document.querySelectorAll('[type=checkbox]:checked')].map(x=>x.value).join(','); 6 } 7}); 8</script> 9<label><input type="checkbox" name="hoge" value="リンゴ" />リンゴ</label> 10<label><input type="checkbox" name="hoge" value="バナナ" />バナナ</label> 11<label><input type="checkbox" name="hoge" value="オレンジ" />オレンジ</label> 12<label><input type="checkbox" name="hoge" value="トマト" />トマト</label> 13<p class="result4"></p>

(2)は条件がわからないので怪しいですがこんなかんじ

javascript

1<script> 2document.addEventListener('change', e=>{ 3 const t=e.target; 4 if(t.matches('[type=checkbox]')){ 5 document.querySelector('.result4').textContent=[...document.querySelectorAll('[type=checkbox]:checked')].map(x=>`no${[...document.querySelectorAll('[type=checkbox]')].indexOf(x)+1}=${x.value}`).join('&'); 6 } 7}); 8</script> 9<label><input type="checkbox" name="hoge" value="リンゴ" />リンゴ</label> 10<label><input type="checkbox" name="hoge" value="バナナ" />バナナ</label> 11<label><input type="checkbox" name="hoge" value="オレンジ" />オレンジ</label> 12<label><input type="checkbox" name="hoge" value="トマト" />トマト</label> 13<p class="result4"></p>

投稿2022/09/02 10:42

編集2022/09/02 10:57
yambejp

総合スコア115201

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

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

m_k

2022/09/05 23:41

お礼が遅くなり申し訳ありません…! 2パターンもご回答いただき本当にありがとうございました;;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問