発生している問題
「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を用いてページタイトルをセットしたいです。(上記は質問用に簡易なコードにしていますが、実際には関数が入り組んでいるためです。)
回答1件
あなたの回答
tips
プレビュー