mond-tech JavaScript 忍者ブログ
焼肉屋さんが大好きです。いや、そうでも無い。 たぷたぷになってきてピンチです。
07
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

テキストエリアで、選択した部分を、任意のタグで囲むJavaScript +
Firefoxで置換後、スクロールがTOPに戻ってしまう不具合が起こらないようにしたスクリプト。

http://archiva.jp/web/javascript/getRange_in_textarea.html
ここのを元にちょろちょろ変えた。冗長っぽい部分省いてみたり。

var isIE = (navigator.appName.indexOf('Microsoft') > -1) ? 1 : 0;
function insertTag(elementId, tag) {
var o = document.getElementById(elementId);
var top = o.scrollTop;
var val = o.value;
var pos = getCursorPosition(o);
if (pos['s'] != pos['e']) {
o.value =
val.slice(0, pos['s']) +
'<'+tag+'>' + val.slice(pos['s'], pos['e']) + '</'+tag+'>' +
val.slice(pos['e']);
o.scrollTop = top;
if (!isIE) { o.setSelectionRange(pos['s'], pos['s']); }
}
else {
o.value =
val.slice(0, pos['s']) +
'<'+tag+'>' + '</'+tag+'>' +
val.slice(pos['e']);
}
}

function getCursorPosition(o) {
if (isIE) {
o.focus();
var range = document.selection.createRange();
var dup = range.duplicate();
dup.moveToElementText(o);
dup.setEndPoint('EndToEnd', range);
return {
s: dup.text.length - range.text.length,
e: dup.text.length - range.text.length + range.text.length
}
}
else {
return {
s: o.selectionStart,
e: o.selectionEnd
}
}
}


insertTag(テキストエリアのエレメントID、囲むタグ)


呼ぶ時は

<button onClick="insertTag('ta', 'pre');">pre</button>
<textarea id="ta" cols="42" rows="16" name="text">hogehoge</textarea>


こんな感じ。

IE6、7、Firefox3、Opera9で試して、きちんと動いているように見える。

デモ
Copyright c mond-tech All Rights Reserved
忍者ブログ / [PR]
にほんブログ村 IT技術ブログ Webサイト構築へ