Подтвердить что ты не робот

JavaScript: прокрутите до выделения после использования textarea.setSelectionRange в Chrome.

Функция javascript выбирает определенное слово в текстовом поле, используя .setSelectionRange(). В Firefox текстовая область автоматически прокручивается вниз, чтобы отобразить выделенный текст. В Chrome (v14) это не так. Есть ли способ заставить Chrome прокручивать текстовую область до вновь выбранного текста? Приветствуем решения jQuery.

4b9b3361

Ответ 1

Вот простое и эффективное решение, чисто js:

//first of all, you ignore any bad english, as i'm french and had a funny evening
//get the textarea
var textArea = document.getElementById('myTextArea');

//define your selection
var selectionStart = 50;
var selectionEnd = 60;
textArea.setSelectionRange( selectionStart, selectionEnd);

// now lets do some math
// we need the number of chars in a row
var charsPerRow = textArea.cols;

// we need to know at which row our selection starts
var selectionRow = (selectionStart - (selectionStart % charsPerRow)) / charsPerRow;

// we need to scroll to this row but scrolls are in pixels,
// so we need to know a row height, in pixels
var lineHeight = textArea.clientHeight / textArea.rows;

// scroll !!
textArea.scrollTop = lineHeight * selectionRow;

Поместите это в функцию, расширьте прототип объекта javascript Element с ним, и вы хорошо.

Не стесняйтесь спрашивать, нужна ли вам дополнительная помощь.

Ответ 2

Вы можете увидеть, как мы решили проблему в ProveIt (см. highlightLengthAtIndex). В принципе, трюк состоит в том, чтобы усечь текстовое поле, прокрутить до конца, а затем восстановить вторую часть текста. Мы также использовали плагин textSelection для согласованного поведения в разных браузерах.

Ответ 3

Я опубликовал ответ здесь:

http://blog.blupixelit.eu/scroll-textarea-to-selected-word-using-javascript-jquery/

Он отлично работает с jsut одним необходимым правилом: установите высоту строки n в css текстового поля!

Он вычисляет позицию слова, чтобы прокрутить, просто выполнив простой математический расчет, и он отлично работал во всех моих экспериментах!

Не стесняйтесь спрашивать меня все, что вам нужно о коде!

Ответ 4

Это код, вдохновленный ответом Matta Flaschen .

/**
 * Scroll textarea to position.
 *
 * @param {HTMLInputElement} textarea
 * @param {Number} position
 */
function scrollTo(textarea, position) {
    if (!textarea) { return; }
    if (position < 0) { return; }

    var body = textarea.value;
    if (body) {
        textarea.value = body.substring(0, position);
        textarea.scrollTop = position;
        textarea.value = body;
    }
}

В принципе, трюк состоит в том, чтобы усечь текстовое поле, прокрутить до конца, а затем восстановить вторую часть текста.

Используйте его следующим образом

var textarea, start, end;
/* ... */

scrollTo(textarea, end);
textarea.focus();
textarea.setSelectionRange(start, end);

Ответ 5

 //Complete code for chrome

              var SAR = {};

            SAR.find = function () {
                debugger;
                var parola_cercata = $("#text_box_1").val(); // the searched word
                // make text lowercase if search is supposed to be case insensitive
                var txt = $('#remarks').val().toLowerCase();
                parola_cercata = parola_cercata.toLowerCase();

                var posi = jQuery('#remarks').getCursorPosEnd(); // take the position of the word in the text

                var termPos = txt.indexOf(parola_cercata, posi);

                if (termPos !== -1) {
                    debugger;
                    var target = document.getElementById("remarks");
                    var parola_cercata2 = $("#text_box_1").val();
                    // select the textarea and the word
                    if (target.setSelectionRange) {

                        if ('selectionStart' in target) {
                            target.selectionStart = termPos;
                            target.selectionEnd = termPos;
                            this.selectionStart = this.selectionEnd = target.value.indexOf(parola_cercata2);
                            target.blur();
                            target.focus();
                            target.setSelectionRange(termPos, termPos + parola_cercata.length);
                        }
                    } else {
                        var r = target.createTextRange();
                        r.collapse(true);
                        r.moveEnd('character', termPos + parola_cercata);
                        r.moveStart('character', termPos);
                        r.select();
                    }
                } else {
                    // not found from cursor pos, so start from beginning
                    termPos = txt.indexOf(parola_cercata);
                    if (termPos !== -1) {
                        var target = document.getElementById("remarks");
                        var parola_cercata2 = $("#text_box_1").val();
                        // select the textarea and the word
                        if (target.setSelectionRange) {

                            if ('selectionStart' in target) {
                                target.selectionStart = termPos;
                                target.selectionEnd = termPos;
                                this.selectionStart = this.selectionEnd = target.value.indexOf(parola_cercata2);
                                target.blur();
                                target.focus();
                                target.setSelectionRange(termPos, termPos + parola_cercata.length);
                            }
                        } else {
                            var r = target.createTextRange();
                            r.collapse(true);
                            r.moveEnd('character', termPos + parola_cercata);
                            r.moveStart('character', termPos);
                            r.select();
                        }
                    } else {
                        alert("not found");
                    }
                }
            };


            $.fn.getCursorPosEnd = function () {
                var pos = 0;
                var input = this.get(0);
                // IE Support
                if (document.selection) {
                    input.focus();
                    var sel = document.selection.createRange();
                    pos = sel.text.length;
                }
                // Firefox support
                else if (input.selectionStart || input.selectionStart === '0')
                    pos = input.selectionEnd;
                return pos;
            };
        </script>