Курсор перемещается в начало текстового поля - PullRequest
6 голосов
/ 23 ноября 2010

У меня есть определенная проблема с IE8 (и только с IE), когда я фокусирую поле ввода, в котором есть текст, курсор перемещается в начало этого поля. Я пытаюсь установить курсор в конце. Я погуглил и нашел следующее решение:

function setSelectionRange(input, selectionStart, selectionEnd) {
    input = document.getElementsByTagName("input")[0];
    if (input.createTextRange) {
        var range = input.createTextRange();
        range.collapse(true);
        range.moveEnd('character', selectionEnd);
        range.moveStart('character', selectionStart);
        range.select();
    }
}

«Вход» здесь просто поле ввода, которое находится в классе (var inputElement = this.input;). Проблема в том, что оба "setSelectionRange" и "createTextRange". Я делаю что-то неправильно? Определяется ли createTextRange только для TextArea?

@ Edit: похоже, я использовал что-то вроде «двух объектов» для ввода js и ввода jquery, после изменения ввода на document.getElementsByTagName («input») [0]; Я могу перейти к ветви "createTextRange", но она все равно не меняет положение курсора.

@ Edit2: я немного изменил код, теперь я получаю ввод из документа, и он входит в ветвь if. Но тогда браузер показывает мне:

Unexpected call to method or property access.

В этой строке var range = input.createTextRange();

@ Edit3: Чтобы ответить на вопрос Джеймса. У меня есть класс, и в этом классе все связано с JSP, который имеет вход. В этом классе я установил обработчик фокуса для поля, которое связано с формой ввода jsp inputElement.focus(onInputFocus), тогда у меня есть что-то вроде этого:

function onInputFocus() {
    isFocused = true;
    valueDivElement.hide();
    labelElement.html(labelFocus);
    if (currentData.selectedEntityCode) {
        inputElement.val(currentData.selectedEntityCode);
        inputElement.attr('title', currentData.selectedEntityCode);
    } else {

    }

    var input = document.getElementsByTagName("input")[0];
    input.value = input.value;
}

Весь класс, очевидно, намного больше, и это не мой код, но я предполагаю, что это последнее, что выполняется.

1 Ответ

4 голосов
/ 23 ноября 2010

Извините, я что-то здесь упустил? Вы пытаетесь установить курсор в конец или выделить диапазон? Ваш вопрос, по-видимому, подразумевает первое, но решение достигает последнего.

Если вы просто хотите установить курсор в конец, то вышеуказанная функция не нужна. Просто сделайте следующее, как только фокус будет установлен:

input.value = input.value; //assumes input is a DOM element.

Смотрите это JSFiddle: http://jsfiddle.net/7vdv6/

EDIT:

Насколько я вижу, есть целый ряд вещей, которые могут отвлекать внимание от вашего ввода:

isFocused = true;
valueDivElement.hide();
labelElement.html(labelFocus);
if (currentData.selectedEntityCode) {
    inputElement.val(currentData.selectedEntityCode);
    inputElement.attr('title', currentData.selectedEntityCode);
} else {

}

Что произойдет, если вы добавите фокус () между двумя последними строками:

var input = document.getElementsByTagName("input")[0];
input.focus();
input.value = input.value;

У вас также есть довольно грязное сочетание jQuery и стандартного JavaScript. Например, почему вы используете document.getElementsByTagName("input")[0], когда вы можете использовать $("input:first") ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...