履歴の残る検索置換
公開日:2014年04月04日
更新日:2014年04月05日
データの整理をしていたら昔のソースコードがでてきた。
しかもDOMの操作でjQuery使わなかったから面倒だった気がする。
履歴の残る検索置換
HTML
<h1>履歴の残る検索置換</h1> <div id="searchBox"> <div style="border:1px solid #DDD;"> <textarea id="str" name="str" rows="4" cols="80">ここに検索置換する文章を入力してください</textarea> <p> 検索する文字 <input type="text" name="search" value="" /><br /> 置換する文字 <input type="text" name="replace" value="" /> </p> </div> <div id="resultbox"></div> <p> <input type="button" value="置換する" onclick="check()" /> <input type="button" value="戻る" onclick="back()" /> <input type="button" value="リセット" onclick="reset()" /> </p> </div>
JavaScript
var tmp = []; //置換で得た文字列を保存する配列 function check() { var textareaStr = ''; if (document.getElementById("resultbox").childNodes.length === 0) { //最初だけtextareaから文字列を取得 var strElm = document.getElementById('str'); textareaStr = strElm.value; //textareaを入力不可に strElm.readOnly = true; } else { //2回目以降は置換で得た文字列を取得 textareaStr = tmp[tmp.length-1]; } //最後の検索用文字列取得 var searchElms = document.getElementsByName("search"); var searchElm = searchElms.item(searchElms.length - 1); var search = searchElm.value; //検索用文字列を入力不可に searchElm.readOnly = true; //最後の置換用文字列取得 var replaceElms = document.getElementsByName("replace"); var replaceElm = replaceElms.item(replaceElms.length - 1); var replace = replaceElm.value; //置換用文字列を入力不可に replaceElm.readOnly = true; //検索用文字列と置換用文字列が空文字じゃなければ処理を行う if (search !== '' && replace !== '') { //次回使用する置換済み文字列を追加 tmp.push(replaceAll(textareaStr, search, replace)); //表示用のspan付き置換文字列を代入 textareaStr = replaceAllSpan(nl2br(h(textareaStr)), nl2br(h(search)), nl2br(h(replace))); //次回使用する入力パーツを表示用変数に追記 textareaStr += '<p>検索する文字 <input type="text" name="search" value="" /><br /> '; textareaStr += '置換する文字 <input type="text" name="replace" value="" /></p>'; //今回の検索置換結果を表示するdiv要素を生成 var divElm = document.createElement('div'); //生成したdiv要素に表示用文字列を代入 divElm.innerHTML = textareaStr; //生成したdiv要素に枠線をつける divElm.style.border = '1px solid #DDD'; //上記で生成したdiv要素を<div id="resultbox">の最後に追加 var resultboxElm = document.getElementById("resultbox"); resultboxElm.appendChild(divElm); } } //履歴全消去関数 function reset() { //検索結果を削除 document.getElementById("resultbox").innerHTML = ''; //検索対象文字列を入力可能に var strElm = document.getElementById('str'); strElm.readOnly = false; //検索・置換文字列を入力可能に var searchElms = document.getElementsByName("search"); var searchElm = searchElms.item(searchElms.length - 1); searchElm.readOnly = false; var replaceElms = document.getElementsByName("replace"); var replaceElm = replaceElms.item(replaceElms.length - 1); replaceElm.readOnly = false; //検索対象文字列管理配列リセット tmp = []; } function back() { //最後の結果を削除 var resultboxElm = document.getElementById("resultbox"); resultboxElm.removeChild(resultboxElm.lastChild); //最後に追加した検索対象文字列を削除 tmp.pop(); //検索対象文字列がなくなったら最初のtextareaを入力可能に if (tmp.length === 0) { var strElm = document.getElementById('str'); strElm.readOnly = false; } //検索・置換文字列を入力可能に var searchElms = document.getElementsByName("search"); var searchElm = searchElms.item(searchElms.length - 1); searchElm.readOnly = false; var replaceElms = document.getElementsByName("replace"); var replaceElm = replaceElms.item(replaceElms.length - 1); replaceElm.readOnly = false; } //HTMLで意味のある記号をエスケープ function h(str) { str = str.replace(/&/g, "&"); str = str.replace(/"/g, """); str = str.replace(/'/g, "'"); str = str.replace(/</g, "<"); str = str.replace(/>/g, ">"); return str; } //改行コードを<br />タグに変換する function nl2br(str) { str = str.replace(/\r\n/g, "<br />"); str = str.replace(/(\n|\r)/g, "<br />"); return str; } //表示用span付置換関数(検索置換した文字列にspanタグをつけて背景を黄色にする) function replaceAllSpan(org, search, replace) { return org.split(search).join('<span style="background-color:#FF0;">' + replace + '</span>'); } //通常置換関数 function replaceAll(org, search, replace) { return org.split(search).join(replace); } window.onload = function () { //textareaの初期値の取り扱い var elm = document.getElementById('str'); elm.onfocus = function () { if (elm.value == elm.defaultValue) { elm.value = ''; elm.style.color = '#000'; } }; elm.onblur = function () { if (elm.value === '') { elm.value = this.defaultValue; elm.style.color = '#CCC'; } }; };
CSS
/*textareaの初期値グレーに*/ #str { color: #CCC; } /*textareaを枠内に納まるように*/ textarea { width: 100%; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -o-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; }
同じカテゴリーのコンテンツ