Установить положение каретки в текстовом поле html
Кто-нибудь знает, как переместить курсор клавиатуры в текстовое поле на определенную позицию?
Например, если текстовое поле (например, элемент ввода, а не текстовая область) содержит в нем 50 символов, и я хочу поместить каретку перед символом 20, как бы я это сделал?
Это отличается от этого вопроса: jQuery Установить положение курсора в текстовой области, для чего требуется jQuery.
Ответы
Ответ 1
Выдержка из Josh Stodola Установка каретки клавиатуры Позиция в текстовом поле или TextArea с Javascript
Общая функция, которая позволит вам вставить каретку в любую позицию текстового поля или текстового поля, которое вы хотите:
function setCaretPosition(elemId, caretPos) {
var elem = document.getElementById(elemId);
if(elem != null) {
if(elem.createTextRange) {
var range = elem.createTextRange();
range.move('character', caretPos);
range.select();
}
else {
if(elem.selectionStart) {
elem.focus();
elem.setSelectionRange(caretPos, caretPos);
}
else
elem.focus();
}
}
}
Первый ожидаемый параметр - это идентификатор элемента, который вы хотите вставить в каретку клавиатуры. Если элемент не может быть найден, ничего не произойдет (очевидно). Второй параметр - индекс позиционирования каретки. Zero поместит клавиатуру в начало. Если вы передадите число, большее, чем количество символов в значении элементов, оно положит каретку клавиатуры в конец.
Протестировано на IE6 и выше, Firefox 2, Opera 8, Netscape 9, SeaMonkey и Safari. К сожалению, в Safari он не работает в сочетании с событием onfocus).
Пример использования вышеуказанной функции, чтобы заставить каретку клавиатуры перейти к концу всех текстовых областей на странице, когда они получают фокус:
function addLoadEvent(func) {
if(typeof window.onload != 'function') {
window.onload = func;
}
else {
if(func) {
var oldLoad = window.onload;
window.onload = function() {
if(oldLoad)
oldLoad();
func();
}
}
}
}
// The setCaretPosition function belongs right here!
function setTextAreasOnFocus() {
/***
* This function will force the keyboard caret to be positioned
* at the end of all textareas when they receive focus.
*/
var textAreas = document.getElementsByTagName('textarea');
for(var i = 0; i < textAreas.length; i++) {
textAreas[i].onfocus = function() {
setCaretPosition(this.id, this.value.length);
}
}
textAreas = null;
}
addLoadEvent(setTextAreasOnFocus);
Ответ 2
Ссылка в ответе битая, эта должна работать (все кредиты идут на blog.vishalon.net):
http://snipplr.com/view/5144/getset-cursor-in-html-textarea/
В случае, если код снова теряется, вот две основные функции:
function doGetCaretPosition(ctrl)
{
var CaretPos = 0;
if (ctrl.selectionStart || ctrl.selectionStart == 0)
{// Standard.
CaretPos = ctrl.selectionStart;
}
else if (document.selection)
{// Legacy IE
ctrl.focus ();
var Sel = document.selection.createRange ();
Sel.moveStart ('character', -ctrl.value.length);
CaretPos = Sel.text.length;
}
return (CaretPos);
}
function setCaretPosition(ctrl,pos)
{
if (ctrl.setSelectionRange)
{
ctrl.focus();
ctrl.setSelectionRange(pos,pos);
}
else if (ctrl.createTextRange)
{
var range = ctrl.createTextRange();
range.collapse(true);
range.moveEnd('character', pos);
range.moveStart('character', pos);
range.select();
}
}
Ответ 3
Так как я действительно действительно нуждался в этом решении и типичном базовом решении (сфокусируйте входные данные - тогда установите значение, равное самому себе) не работает кросс-браузер, я потратил некоторое время на настройку и редактируя все, чтобы заставить его работать. Основываясь на коде @ kd7 здесь, что я придумал.
Наслаждайтесь! Работает в IE6 +, Firefox, Chrome, Safari, Opera
Метод позиционирования с использованием браузера (пример: перемещение курсора к END)
// ** USEAGE ** (returns a boolean true/false if it worked or not)
// Parameters ( Id_of_element, caretPosition_you_want)
setCaretPosition('IDHERE', 10); // example
Мясо и картофель - это в основном @ kd7 setCaretPosition, при этом самая большая настройка if (el.selectionStart || el.selectionStart === 0)
, в firefox выбор начинается с 0, что, конечно, булево обращается к False, поэтому он ломается там.
В хроме самая большая проблема заключалась в том, что просто дать ей .focus()
было недостаточно (он продолжал выбирать ВСЕ текст!). Поэтому мы устанавливаем значение самого себя, себе el.value = el.value;
перед вызовом нашей функции, и теперь у него есть захват и позиция с помощью ввода, чтобы использовать selectionStart.
function setCaretPosition(elemId, caretPos) {
var el = document.getElementById(elemId);
el.value = el.value;
// ^ this is used to not only get "focus", but
// to make sure we don't have it everything -selected-
// (it causes an issue in chrome, and having it doesn't hurt any other browser)
if (el !== null) {
if (el.createTextRange) {
var range = el.createTextRange();
range.move('character', caretPos);
range.select();
return true;
}
else {
// (el.selectionStart === 0 added for Firefox bug)
if (el.selectionStart || el.selectionStart === 0) {
el.focus();
el.setSelectionRange(caretPos, caretPos);
return true;
}
else { // fail city, fortunately this never happens (as far as I've tested) :)
el.focus();
return false;
}
}
}
}
Ответ 4
Я немного скорректировал ответ kd7, потому что elem.selectionStart будет оценивать значение false, когда selectStart случайно 0.
function setCaretPosition(elem, caretPos) {
var range;
if (elem.createTextRange) {
range = elem.createTextRange();
range.move('character', caretPos);
range.select();
} else {
elem.focus();
if (elem.selectionStart !== undefined) {
elem.setSelectionRange(caretPos, caretPos);
}
}
}
Ответ 5
Если вам нужно сфокусировать несколько текстовых полей, и ваша единственная проблема в том, что весь текст будет выделен, тогда как вы хотите, чтобы карет был в конце, тогда в этом конкретном случае вы можете использовать этот трюк для установки значения текстового поля самому себе после фокуса:
$("#myinputfield").focus().val($("#myinputfield").val());
Ответ 6
function SetCaretEnd(tID) {
tID += "";
if (!tID.startsWith("#")) { tID = "#" + tID; }
$(tID).focus();
var t = $(tID).val();
if (t.length == 0) { return; }
$(tID).val("");
$(tID).val(t);
$(tID).scrollTop($(tID)[0].scrollHeight); }
Ответ 7
<!DOCTYPE html>
<html>
<head>
<title>set caret position</title>
<script type="application/javascript">
//<![CDATA[
window.onload = function ()
{
setCaret(document.getElementById('input1'), 13, 13)
}
function setCaret(el, st, end)
{
if (el.setSelectionRange)
{
el.focus();
el.setSelectionRange(st, end);
}
else
{
if (el.createTextRange)
{
range = el.createTextRange();
range.collapse(true);
range.moveEnd('character', end);
range.moveStart('character', st);
range.select();
}
}
}
//]]>
</script>
</head>
<body>
<textarea id="input1" name="input1" rows="10" cols="30">Happy kittens dancing</textarea>
<p> </p>
</body>
</html>
Ответ 8
Я бы исправил следующие условия:
function setCaretPosition(elemId, caretPos)
{
var elem = document.getElementById(elemId);
if (elem)
{
if (typeof elem.createTextRange != 'undefined')
{
var range = elem.createTextRange();
range.move('character', caretPos);
range.select();
}
else
{
if (typeof elem.selectionStart != 'undefined')
elem.selectionStart = caretPos;
elem.focus();
}
}
}
Ответ 9
Я нашел простой способ решить эту проблему, протестировано в IE и Chrome 100%
function setCaret(eleId, caret)
{
var elem = document.getElementById(elemId);
elem.setSelectionRange(caret, caret);
}
Передайте идентификатор текстового поля и позицию каретки в эту функцию