如何为输入元素添加原型?

7

我有一个输入元素:

<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;
}

我该如何在IE中为<input type="text" />添加此“属性”?这是否可能?
3个回答

4

您需要扩展HTMLInputElement接口,如下所示:

HTMLInputElement.prototype.selectionStart = …

然而,JavaScript专家认为这是一种不好的做法。

bad practice(不良实践)。


4
首先,在原则和实践上,尝试扩展主机对象都是一个不好的想法。主机对象例如DOM元素可以做几乎任何事情;特别地,它们不必支持你试图做的事情,在IE <= 8中,这就是你使用此代码的目标,DOM元素根本不支持这种操作。你的选择是要使用一个函数来传递输入元素,或者为每个输入创建一个包装器对象,该对象具有所需的方法和属性。
其次,你的GetSelectionStart()和GetSelectionEnd()函数存在缺陷:它们无法正确处理文本区域中的新行,并且在lastIndexOf周围存在错误的逻辑(如果所选文本在输入中出现多次怎么办?)。我已经做了很多工作,提出了我相当确信是在所有主要浏览器中获取输入和文本区域选择的最佳函数,我最近发布了这里的链接:是否可能在元素内以编程方式检测插入符位置?


0

它们相关,但并不是同一个问题。 - BrunoLM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接