履歴の残る検索置換
公開日: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;
}
同じカテゴリーのコンテンツ