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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

JavaScript

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

Q&A

解決済

3回答

2041閲覧

inputの内容に応じてクエリパラメータを動的に変更したい

maskmelon

総合スコア63

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

JavaScript

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

0グッド

0クリップ

投稿2020/08/17 06:21

編集2020/08/17 13:52

html

1 <a href="?gender=male&minAge=20&maxAge=25" id="search">search</a>

性別と年齢の幅をユーザーが指定すると、それに応じてリンク先のURLにクエリパラメータが付与される機能を実装したいです。

上に挙げたリンクはクエリパラメータが静的な状態になっていますが、これをinputの入力内容に応じて動的に変更する良い方法はあるでしょうか?

###追記(実装例1)
次のように実装することができました。回答して下さった皆様ありがとうございました。

HTML

1 <a href="" id="search">search</a> 2 <input type="text" name="gender" class="inp"><br> 3 <input type="text" name="minAge" class="inp"><br> 4 <input type="text" name="maxAge" class="inp"><br>

JavaScript

1const searchButton = document.getElementById('search'); 2 3searchButton.onclick = () => { 4 const inputs = document.querySelectorAll('.inp'); 5 const keyval = [...inputs].map((e) => [e.name, e.value]); 6 const searchParams = new URLSearchParams(keyval); 7 const href = `?${searchParams.toString()}`; 8 searchButton.setAttribute('href', href); 9}; 10

###追記(実装例2)
性別の選択をラジオボタンに変更した場合

HTML

1<input type="radio" name="gender" value="male" class="radioInp"> 2<label for="inq1">男性</label> 3<input type="radio" name="gender" value="famale" class="radioInp"> 4<label for="inq2">女性</label> 5<input type="radio" name="gender" value="" class="radioInp"> 6<label for="inq3">指定なし</label><br> 7<label>minAge</label> <input type="text" name="minAge" class="inp"><br> 8<label>maxAge</label> <input type="text" name="maxAge" class="inp"><br> 9<a href="" id="search">search</a>

JavaScript

1const searchButton = document.getElementById('search'); 2 3searchButton.onclick = () => { 4 const inputs = document.querySelectorAll('.inp'); 5 const keyval1 = [...inputs].map((e) => [e.name, e.value]); 6 7 const radioInputs = document.querySelectorAll('.radioInp'); 8 const keyval2 = [...radioInputs].filter((e) => e.checked).map((e) => [e.name, e.value]); 9 10 const keyval = keyval1.concat(keyval2); 11 12 const searchParams = new URLSearchParams(keyval); 13 const href = `?${searchParams.toString()}`; 14 searchButton.setAttribute('href', href); 15}; 16

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

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

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

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

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

guest

回答3

0

ベストアンサー

モダンブラウザ限定ですが URLSearchParams も使えそうですね。

javascript

1let params = new URLSearchParams({a:"AA",b:"BB",c:null, d:undefined}); 2console.log( params.toString() );// "a=AA&b=BB&c=null&d=undefined" 3 4let params2 = new URLSearchParams([["a","AA"],["b","BB"]]); 5console.log( params2.toString() );// "a=AA&b=BB" 6 7// 追記:input[type=checkbox] など 複数選択可能なフォーム情報を扱う場合 8var params3 = new URLSearchParams([["a","AA"],["b","BB"],["b","BB2"]]); 9console.log( params3.toString() );// "a=AA&b=BB&b=BB2"

※ご質問では フォームの値なので input[value] の未入力は "" ですが、nullundefined を値に渡す際は注意が必要です。


html

1gender:<input type="text" name="gender" class="inp"><br> 2minAge:<input type="text" name="minAge" class="inp"><br> 3maxAge:<input type="text" name="maxAge" class="inp"><br>

javascript

1// 以下 1. 2. のケースで共通 2let inputs = document.querySelectorAll(".inp"); 3 4// 1 連想配列的に使うオブジェクトを中継する 5let keyval = [...inputs].reduce((a,e)=>(a[e.name]=e.value,a),{}); 6let sea = new URLSearchParams(keyval); 7let href = "?" + sea.toString(); 8 9// 2 キーバリューの entries を示す2次元配列を中継する 10let keyval2 = [...inputs].map(e => [e.name, e.value]); 11let sea2 = new URLSearchParams(keyval2); 12let href2 = "?" + sea2.toString(); 13

追記)radio / checkbox への対応

javascript

1// 3 キーバリューの entries を示す2次元配列を中継する 2let keyval3 = [...inputs].reduce(e =>{ 3 if( e.type.match(/radio|checkbox/) ? e.checked : true ) { 4 a.push([e.name, e.value]); 5 } 6 return a 7}, []); 8let sea3 = new URLSearchParams(keyval2); 9let href3 = "?" + sea2.toString(); 10

投稿2020/08/17 10:18

編集2020/08/17 12:31
AkitoshiManabe

総合スコア5434

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

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

maskmelon

2020/08/17 12:21

頂いた回答を参考にして実装することができました。ありがとうございます。 質問内容とは逸れるのですが、性別の入力をラジオボタンに変更したい場合どうすればいいのでしょうか? 現状、どのボタンを選択しても全てのvalueがパラメータに入ってしまいます。(追記2)
AkitoshiManabe

2020/08/17 12:25

ラジオボタンやチェックボックスは checked プロパティで判別して keyval を整える必要がありますね。
maskmelon

2020/08/17 13:42

ラジオボタンでも実装できました。回答・アドバイス本当にありがとうございました。
guest

0

こんな感じでしょうか

投稿2020/08/17 07:27

yambejp

総合スコア116724

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

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

yambejp

2020/08/17 07:27

<script> window.addEventListener('DOMContentLoaded', ()=>{ document.querySelectorAll('.inp').forEach(x=>{ x.addEventListener('change',()=>{ var href="?"+[...document.querySelectorAll('.inp')].map(x=>`${x.name}=${encodeURIComponent(x.value)}`).join("&"); document.querySelector('#search').setAttribute('href',href); }); }); }); </script> <a href="" id="search">search</a> gender:<input type="text" name="gender" class="inp"><br> minAge:<input type="text" name="minAge" class="inp"><br> maxAge:<input type="text" name="maxAge" class="inp"><br>
maskmelon

2020/08/17 12:23

参考になりました。ご回答頂きありがとうございました。
guest

0

過去に同様の質問がありますので、参考になるかと思います。

inputで入力された文字列をURLパラメータに入れて送るJS
https://teratail.com/questions/3990

投稿2020/08/17 07:08

mar-kn

総合スコア306

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

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

maskmelon

2020/08/17 12:23

参考になりました。ご回答頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問