Невозможно установить курсор в конец после изменения содержимого текстового поля

Мне нужно написать код, который преобразует ввод текста на мой язык (Bangla). Для этого я обнаруживаю каждое нажатие клавиши, если оно попадает в границы от A до Z или от 0 до 9, я пишу соответствующий код и, наконец, устанавливаю курсор в определенную позицию.

Теперь у меня проблема с элементом типа <input type="textbox" />, потому что я получаю правильную позицию курсора, я пишу в правильную позицию, но проблема в следующем:

Рассмотрим случай, когда вы ввели символ, при этом видимая область в текстовом поле рассчитана только на 10 символов. В этом случае желаемый результат: после того, как я перезапишу свое измененное значение в текстовое поле на 11-й позиции, поле ввода должно показать позицию: от 1 до 11, а курсор должен быть помещен в 11-ю позицию ....... Но в моем случае , видимая область остается на позициях от 0 до 10 (я имею в виду изначально, как было)

Я пробовал все возможные решения, которые нашел в stackoverflow, но не решил эту проблему. Больше всего я пробовал эту демонстрационную страницу: http://demo.vishalon.net/getset.htm


Код можно найти по адресу:

http://jsbin.com/abexeq/3/edit

и демо:

http://jsbin.com/abexeq/3/


Пожалуйста, помогите мне написать функцию writeFinalValue в верхней части HTML-кода, чтобы эта проблема была решена.

Код:

/// <summary>Write finalText to the text/input box</summary>
Keyboard.prototype.writeFinalValue = function (finalText, caretPosition) {

    var scrollTop = this.textInputSource.scrollTop;

    if (typeof this.textInputSource.selectionStart == "number" && typeof this.textInputSource.selectionEnd == "number") {
        // Non-IE browsers and IE 9
        this.textInputSource.value = finalText;

        this.textInputSource.value = this.textInputSource.value;
        //        // Move the caret
        //        this.textInputSource.selectionStart = caretPosition;
        //        this.textInputSource.selectionEnd = caretPosition;
    }
    else if (document.selection && document.selection.createRange) {
        // For IE up to version 8
        var selectionRange = document.selection.createRange();
        var textInputRange = this.textInputSource.createTextRange();
        var precedingRange = this.textInputSource.createTextRange();
        var bookmark = selectionRange.getBookmark();
        textInputRange.moveToBookmark(bookmark);
        precedingRange.setEndPoint("EndToStart", textInputRange);
        var start = precedingRange.text.length;
        var end = start + selectionRange.text.length;

        this.value = finalText;

        //        // Move the caret
        //        textInputRange = this.createTextRange();
        //        textInputRange.collapse(true);
        //        textInputRange.move("character", start - (this.textInputRange.value.slice(0, start).split("\r\n").length - 1));
        //        textInputRange.select();
    }

    this.textInputSource.focus();
    this.textInputSource.scrollTop = scrollTop;

    // move caret
    if (this.textInputSource.setSelectionRange) {
        this.textInputSource.setSelectionRange(caretPosition, caretPosition);
//        this.textInputSource.value = this.textInputSource.value;
    }
    else if (this.textInputSource.createTextRange) {
        var range = this.textInputSource.createTextRange();
        range.collapse(true);
        range.moveEnd('character', caretPosition);
        range.moveStart('character', caretPosition);
        range.select();
    }
}

Спасибо.

N.B. Мне нужно предложение для Firefox / Chrome в основном потому, что Internet Explorer меня не касается.


person seoul    schedule 06.07.2011    source источник
comment
Живые ссылки - отличное дополнение к вопросу, но всегда также публикуйте соответствующий код в вопросе. Две причины. 1. Люди не должны переходить по ссылке, чтобы помочь вам. 2. StackOverflow предназначен быть ресурсом не только для вас сейчас, но и для других, у которых возникнет аналогичная проблема в будущем. Внешние ссылки можно перемещать, изменять, удалять и т. Д. Убедившись, что в вопросе указан соответствующий код, мы гарантируем, что вопрос (и ответы на него) останутся полезными в течение разумного периода времени.   -  person T.J. Crowder    schedule 06.07.2011
comment
Я исправил для вас форматирование, один из ваших абзацев был почти нечитаемым, потому что он был с отступом в четыре пробела. Это означает, что это код для StackOverflow и поэтому он отображается с одинарным интервалом, а не с переносом слов ... Проверьте поле Как форматировать справа, когда вы вводите свой вопрос, и предварительный просмотр область под ним, где вы можете увидеть результаты.   -  person T.J. Crowder    schedule 06.07.2011


Ответы (1)


Самым надежным кроссбраузерным решением, которое я когда-либо видел для установки фокуса / курсора в конце текстового поля, является jQuery PutCursorAtEnd. Я бы порекомендовал вам использовать этот плагин, чтобы решить эту проблему.

Обновить

Я пробовал это, и на самом деле он прокручивается до конца текстового поля, если текст переполняется. В вашем примере (http://jsbin.com/unejup/6), похоже, тоже работает, но только для второго щелчка по кнопке «Установить позицию».

<script>
// http://plugins.jquery.com/project/PutCursorAtEnd
$(function () {
    $('#foo').putCursorAtEnd();
});
</script>

<input type="text" id="foo" value="abcdefghijklmnopqrstuvwxyz" />
person Martin Buberl    schedule 06.07.2011
comment
Пробовал их код. это не сработало :-( Проблема в том, что до тех пор, пока я не переписываю содержимое поля ввода, представление находится в позиции 1-11, но как только я что-то пишу, текст помещается в 11-ю позицию, но область просмотра показывает позицию 0-9. Он должен скользить ....... Из вашей ссылки я точно реализовал это: _1 _..... Но не повезло, потому что курсор помещен туда, но область просмотра не сдвинута - person seoul; 06.07.2011
comment
Я не знал, что он не прокручивается до конца, если в текстовом поле есть переполненный текст. На этот вопрос / ответ SO есть еще несколько вариантов, возможно, это поможет: stackoverflow.com/questions/511088/ - person Martin Buberl; 06.07.2011
comment
Я думаю, что это фундаментальный дизайн браузеров, для которого я не получаю желаемого результата. Проверьте по этой ссылке: jsbin.com/unejup/6, введите любую позицию и нажмите "Установить позицию". .... Тогда позиция будет установлена ​​(легко проверяется нажатием кнопки get position), но область просмотра не будет смещена - person seoul; 06.07.2011
comment
Еще одна (непроверенная) идея, которую вы могли бы попробовать. Что произойдет, если вы сначала установите фокус в конец текстового поля, а затем инициируете событие, такое как нажатие клавиши. - person Martin Buberl; 06.07.2011
comment
смоделировал это поведение, но не повезло: - | - person seoul; 06.07.2011
comment
Я попробовал и обновил свой ответ. Ваш пример, кажется, работает только для второго щелчка, поэтому я бы более подробно рассмотрел это поведение. В общем вроде работает. Надеюсь, это поможет. - person Martin Buberl; 06.07.2011
comment
окк ... но у меня на пк не работает даже на 2/3/4 клик :-( все равно пусть будет как есть и справится. - person seoul; 08.07.2011
comment
Спасибо за ваш ответ :-) - person seoul; 08.07.2011