そのフィールドにフォーカスがない場合、入力テキスト ボックスで選択したテキスト/キャレットの位置を (確実に) 取得することは可能ですか?
そうでない場合、このデータを取得して保持する最善の方法は何ですか?
基本的に、ユーザーがボタンをクリックすると、キャレットの位置にテキストを挿入したいと思います。ただし、ユーザーがそのボタンをクリックするとすぐに、フィールドがフォーカスを失い、キャレットの位置が失われます。
そのフィールドにフォーカスがない場合、入力テキスト ボックスで選択したテキスト/キャレットの位置を (確実に) 取得することは可能ですか?
そうでない場合、このデータを取得して保持する最善の方法は何ですか?
基本的に、ユーザーがボタンをクリックすると、キャレットの位置にテキストを挿入したいと思います。ただし、ユーザーがそのボタンをクリックするとすぐに、フィールドがフォーカスを失い、キャレットの位置が失われます。
次のスクリプトはキャレットの位置を保持し、ボタンをクリックすると、保存された位置にテキストが挿入されます。
Javascript:
<script type="text/javascript">
//Gets the position of the cursor
function getCaret(el) {
if (el.selectionStart) {
return el.selectionStart;
} else if (document.selection) {
el.focus();
var r = document.selection.createRange();
if (r == null) {
return 0;
}
var re = el.createTextRange(),
rc = re.duplicate();
re.moveToBookmark(r.getBookmark());
rc.setEndPoint('EndToStart', re);
return rc.text.length;
}
return 0;
}
function InsertText() {
var textarea = document.getElementById('txtArea');
var currentPos = getCaret(textarea);
var strLeft = textarea.value.substring(0,currentPos);
var strMiddle = "-- Hello World --";
var strRight = textarea.value.substring(currentPos,textarea.value.length);
textarea.value = strLeft + strMiddle + strRight;
}
</script>
HTML:
<textarea id="txtArea" >Lorem ipsum dolor sit amet, consectetur adipiscing elit.</textarea>
<button onclick="InsertText();">Insert Text</button>
変数 onblur でキャレット位置を保持する場合は、スクリプトを変更できます。
次の 2 つの関数を使用して、テキスト選択を保存および復元します。
function saveSelection() {
if (window.getSelection) {
sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
return sel.getRangeAt(0);
}
} else if (document.selection && document.selection.createRange) {
return document.selection.createRange();
}
return null;
}
function restoreSelection(range) {
if (range) {
if (window.getSelection) {
sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
} else if (document.selection && range.select) {
range.select();
}
}
}
に何かを入力し、 のTEXTAREA
外側TEXTAERA
をクリックして選択を解除し、フォーカス ボタンをクリックして選択を復元し、再度フォーカスします。