Кроссбраузерный способ получить/установить выделение в полях input[text] и textarea с помощью JavaScript

Так как способы чтения/установки выделения в поле ввода различны для разных браузеров, предлагаю вашему вниманию две функции, для выполнения этих операций.

Чтение:

/**
 * Функция для получения параметров выделения в инпуте
 *
 * @param inputBox Элемент по которому нужна информация (HTMLInputElement)
 * @return object {start:начало выделения, end:конец выделения}
 */
function getSelection(inputBox)
{
        if ("selectionStart" in inputBox) { //gecko
                return {
                        start: inputBox.selectionStart,
                        end: inputBox.selectionEnd
                }
        }

        //and now, the blinkered IE way
        var bookmark = document.selection.createRange().getBookmark()
        var selection = inputBox.createTextRange()

        selection.moveToBookmark(bookmark)

        var before = inputBox.createTextRange()
        before.collapse(true)
        before.setEndPoint("EndToStart", selection)

        var beforeLength = before.text.length
        var selLength = selection.text.length
        return {
                start: beforeLength,
                end: beforeLength + selLength
        }
}

Установка:

/**
 * Установка выделения в инпуте
 *
 * @param inputBox Элемент в котором устанавливается выделение (HTMLInputElement)
 * @param start Начальная позиция выделения (int)
 * @param end Конечная позиция выделения (int)
 */
function setSelection(inputBox, start, end)
{
    if (start > end)
    {
         start = end
    }
    if ("selectionStart" in inputBox) { //gecko
         inputBox.setSelectionRange(start,end);
         return true;
    }
    else
    {
        r = inputBox.createTextRange();
        r.collapse(true);
        r.moveStart('character',start);
        r.moveEnd('character',end-start);
        r.select();
        return true;
    }
}

К сожалению, оригинальные источники этих функций утеряны, если кто-то напомнит — внесу ссылку в пост.

  • analitick

    спасибо, мужик, очень помог