Как добавить прототип для элемента ввода? - PullRequest
7 голосов
/ 17 ноября 2010

У меня есть элемент ввода:

<input type="text" id="t" value="abcdefghij" />

Я хочу создать selectionStart

document.getElementById("t").selectionStart

Мне нужны следующие функции:

function GetSelectionStart(o) {
    if (o.createTextRange) {
        var r = document.selection.createRange().duplicate()
        r.moveEnd('character', o.value.length)
        if (r.text == '') return o.value.length
        return o.value.lastIndexOf(r.text)
    } else return o.selectionStart;
}

function GetSelectionEnd(o) {
    if (o.createTextRange) {
        var r = document.selection.createRange().duplicate()
        r.moveStart('character', -o.value.length)
        return r.text.length
    } else return o.selectionEnd;
}

Как я могу добавить это "свойство" в <input type="text" /> в IE? Возможно ли это?

Ответы [ 3 ]

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

Во-первых, как в принципе, так и на практике плохая идея расширять хост-объекты.Хост-объекты, такие как элементы DOM, могут делать то, что им нравится;в частности, они не обязаны поддерживать то, что вы пытаетесь сделать, и в IE <= 8, на что вы нацелены с помощью этого кода, элементы DOM просто не поддерживают это.Вы можете либо использовать функцию, которой вы передаете элемент ввода, либо создать объект-оболочку для каждого ввода, имеющего необходимые методы и свойства. </p>

Во-вторых, ваши функции GetSelectionStart() и GetSelectionEnd()имеют недостатки: они не будут правильно обрабатывать новые строки в текстовых областях и имеют некорректную логику около lastIndexOf (что, если выделенный текст появляется более одного раза во входных данных?).Я проделал довольно большую работу над этим и пришел к выводу, что, как я убежден, это лучшая функция для получения ввода и выбора текстовой области во всех основных браузерах, которую я в последний раз выкладывал здесь пару дней назад: Возможно ли программно определить положение каретки в пределахэлемент

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

Вам нужно расширить интерфейс HTMLInputElement, например:

HTMLInputElement.prototype.selectionStart = …

Однако эксперты JavaScript считают это плохой практикой .

0 голосов
/ 17 ноября 2010
...