IE7中的HTMLInputElement

时间:2012-09-11 09:35:59

标签: javascript dom internet-explorer-7

我正在为crossbrowser input& textarea selection getter和setter编写扩展。 这就是我编写代码的方式:

HTMLInputElement.prototype.getSelectionRange = get_selection_range;
HTMLInputElement.prototype.setSelection = set_selection_range;
HTMLTextAreaElement.prototype.getSelectionRange = get_selection_range;
HTMLTextAreaElement.prototype.setSelection = set_selection_range;

get_selection_range和set_selection_range是那些扩展函数。所以我只想替换

someInputElement.selectionStart = a;  // and whole lot of code due to browser
someInputElement.selectionEnd = b;    // compatibility

只是

someInputElement.setSelection(a, b);
someInputElement.setSelection({ start: a, end: b });
someOtherElement.setSelection(someInputElement.getSelection());

但后来我在IE7中遇到了几个困难。 首先,IE7不知道什么是HTMLInputElement。

我不想扩展整个Object。好吧,那将是我要做的最后一件事,但我想逃避它。 函数get_selection_range和set_selection_range都没关系,不要问内在的是什么,你已经看过几次了。

所以问题是:JS7中的HTMLInputElement是否有任何合法替代?

UPD:我已经制定了自己的解决方案而没有扩展任何全局对象类型:

var SmartInputSelection = Base.extend({
    constructor: function (options) {
        this.node = options.node;
        this.CHARACTER = "character";
        this.END_TO_END = "EndToEnd";
        this.END_TO_START = "EndToStart";
    },
    setSelection: function (a, b) {
        if (b === undefined && typeof a == "number")
            b = a;
        else if (b === undefined) {
            b = a.end;
            a = a.start;
        }

        if (this.node.selectionStart !== undefined) {
            this.node.selectionStart = a;
            this.node.selectionEnd = b;
        } else {
            var textRange = this.node.createTextRange();
            textRange.collapse(true);
            textRange.moveStart(this.CHARACTER, a);
            textRange.moveEnd(this.CHARACTER, b - a);
            textRange.select();
        }
    },
    getSelection: function () {
        var start, end;
        if (this.node.selectionStart !== undefined) {
            start = this.node.selectionStart;
            end = this.node.selectionEnd;
        } else {
            var range = document.selection.createRange();
            if (range == null) {
                start = end = 0;
            }

            var textRange = this.node.createTextRange(),
            duplicate = textRange.duplicate();
            textRange.moveToBookmark(range.getBookmark());
            duplicate.setEndPoint(this.END_TO_END, textRange);
            end = duplicate.text.length;
            duplicate.setEndPoint(this.END_TO_START, textRange);
            start = duplicate.text.length;
        }

        return {
            start: start,
            end: end
        };
    }
});

所以现在我只需声明:

function SelectSomeTextInsideInput (input /* input is some DOM element */) {
    var smartInputSelection = new SmartInputSelection({ node: input });
    smartInputSelection.setSelection(0);
    smartInputSelection.setSelection(2, 5);
    smartInputSelection.setSelection({ start: 2, end: 5 });
    smartInputSelection.getSelection(); // start: 2, end: 5
}

2 个答案:

答案 0 :(得分:0)

没有。 我最近和IE9打架,然后通过切换到HTML5模式让它工作 我猜IE7太老了,不能以任何方式支持它。

无论如何,尝试将此声明放在页面顶部:

<!doctype HTML>

编辑:并在此处查看此答案:Element.prototype in IE7?

答案 1 :(得分:0)

您不应该依赖这些对象进行全局定义,因为您已经注意到在某些浏览器中它们不是。