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

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

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

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

568閲覧

new URL が勝手に変換する値をすべて知りたいです

nikuatsu

総合スコア177

JavaScript

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2022/04/19 09:22

編集2022/04/19 09:30

発生している問題

「cat dog」の入力値で検索したときに、URLが「 http://example.com/search?q=cat+dog 」と勝手に変換されるのはいいのですが、しかしページタイトルまで<h1>cat+dogの検索結果です</h1>となってしまいます。

実現したいこと

ページタイトルを<h1>cat dogの検索結果です</h1>のように、「cat dog」という入力値に戻したいです。

該当のソースコード

html

1<input placeholder="検索ワードを入力してください" value="cat dog bird + giraffe"> 2<button>検索</button> 3<h1>ページタイトル</h1>

JavaScript

1// 検索をクリック 2$('button').click(function() { 3 // URLを変更 4 const inpVal = $('input').val(); 5 let url = setParams( location.href , {q:inpVal} ); 6 history.pushState( null, '', url ); 7 8 // タイトルを変更 9 setTtl( url ); 10}); 11 12// タイトルを変更 13function setTtl( url ){ 14 const inp = getParams(url).q || ''; 15 16 // これでは「+」や「%2B」など不要な記号がタイトルに入ってしまう 17 const ttl = inp; 18 19 $('h1').text(ttl+'の検索結果です'); 20} 21 22// パラメータをセット 23function setParams( url, param ){ 24 25 let result = url; 26 const obj = new URL(url); 27 const params = obj.searchParams; 28 29 Object.keys(param).forEach((k,i)=>{ 30 const v = param[k].replace(/\s+/g, ' '); 31 params.set(k, v); 32 }); 33 34 return obj.toString(); 35} 36 37// パラメータを取得 38function getParams( url = location.href ){ 39 let result = {}; 40 const obj = new URL( url ); 41 42 if( obj.search ){ 43 const arr = obj.search.substr(1).split('&'); 44 let key = null; 45 for(var i = 0 ; i < arr.length ; i++){ 46 key = arr[i].split("="); 47 result[key[0]] = key[1]; 48 } 49 } 50 51 return result; 52}

試したこと

「+」などがdecodeURIで元に戻せないのが厄介なところです。
そこで自前の関数my_decodURIを作り、次のように実装しました。

JavaScript

1// 元に戻す 2function my_decodeURI( url ){ 3 let result = url; 4 5 // "+" -> 半角スペース 6 result = result.replace(/\+/g, ' '); 7 8 // "%2B" -> "+" 9 result = result.replace(/%2B/g, '+'); 10 11 return result; 12}

JavaScript

1// タイトルを変更 2function setTtl( url ){ 3 const inp = getParams(url).q || ''; 4 5 // これでは「+」や「%2B」など不要な記号がタイトルに入ってしまう 6 // const ttl = inp; 7 8 // 元に戻す 9 const ttl = my_decodeURI(inp); 10 11 $('h1').text(ttl+'の検索結果です'); 12}

この結果がこちらで、実現したいページタイトルとなりました。
https://jsfiddle.net/f2jmk1Lt/

しかしmy_decodeURIは2つの記号にしか対応できていません。

他に勝手に変換される値があるかもしれないのでそれらにも対処できるように修正したいのですが、どのようにしたらよろしいでしょうか?

尚、MDNにも何がどう変換されるのか一覧がなく、分からない状況です。

条件

条件がございます。setTtl()inpValは渡せません。あくまで変換されたURLを用いてページタイトルをセットしたいです。(上記は質問用に簡易なコードにしていますが、実際には関数が入り組んでいるためです。)

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

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

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

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

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

Lhankor_Mhy

2022/04/19 09:57

「いろは」などのマルチバイト文字は捨てるのですか?
nikuatsu

2022/04/19 10:11

「いろな」が入力値ならそのまま「いろは」と取得したいです。
Lhankor_Mhy

2022/04/19 10:34

では、+ の問題ではなくて、パーセントエンコーディング全体の問題では?
nikuatsu

2022/04/19 11:33 編集

すみません、「全体の問題」の意味するところがよくわかりません。 例えば次の3つは最後の「%20」だけデコードできますが、「+」や「%2B」はできません。この2つは「全体の問題」には含まれますか?含まれるのでしたら質問したいのは「全体の問題」だと思います。これら2つも元に戻したのです。 console.log( decodeURI('http://example.com/search?q=cat+dog') ); console.log( decodeURI('http://example.com/search?q=cat%2Bdog') ); console.log( decodeURI('http://example.com/search?q=cat%20dog') );
guest

回答1

0

ベストアンサー

js

1 if( obj.search ){ 2 const arr = obj.search.substr(1).split('&');

ここで obj.searchParams を参照して URLSearchParams インターフェイスを利用しましょう。適切にデコードしてくれます。

投稿2022/04/19 09:33

int32_t

総合スコア20832

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

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

nikuatsu

2022/04/19 11:27 編集

ありがとうございます。MDN拝見しましたが、こういうことでしょうか? // パラメータを取得 function getParams( url = location.href ){ let result = {}; const obj = new URL( url ); if( obj.search ){ const arr = obj.searchParams; for (const [key, value] of arr.entries()) { result[key] = value; } } return result; }
int32_t

2022/04/19 13:29 編集

そんな感じで大丈夫だと思います。 obj.searchParams をそのまま return して、利用側では getParams(...).get('q') でもよいですね。
nikuatsu

2022/04/20 02:25

ご返信ありがとうございます。なるほど。何をしているのかわかりやすいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問