JSFiddle - React, Tailwind, and code Playground

HTML

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

JavaScript

// 検索をクリック
$('button').click(function() {
	// URLを変更
	const inpVal = $('input').val();
	let url = setParams( location.href , {q:inpVal} );
	history.pushState( null, '', url );

	// タイトルを変更
	setTtl( url );
});

// タイトルを変更
function setTtl( url ){
	const inp = getParams(url).q || '';

	// これでは「+」や「%2B」など不要な記号がタイトルに入ってしまう
	// const ttl = inp;

	// 元に戻す
	const ttl = my_decodeURI(inp);

	$('h1').text(ttl+'の検索結果です');
}

// パラメータをセット
function setParams( url, param ){

	let result = url;
	const obj = new URL(url);
	const params = obj.searchParams;

	Object.keys(param).forEach((k,i)=>{
		const v = param[k].replace(/\s+/g, ' ');
		params.set(k, v);
	});

	return obj.toString();
}

// パラメータを取得
function getParams( url = location.href ){
	let result = {};
	const obj = new URL( url );
  
	if( obj.search ){
		const arr = obj.search.substr(1).split('&');
		let key = null;
		for(var i = 0 ; i < arr.length ; i++){		
			key = arr[i].split("=");
			result[key[0]] = key[1];
		}
	}
  
	return result;
}

// 元に戻す
function my_decodeURI( url ){
	let result = url;

	// "+" -> 半角スペース
	result = result.replace(/\+/g, ' '); 

	// "%2B" -> "+"
	result = result.replace(/%2B/g, '+'); 

	return result;
}