2

クロスブラウザ入力とテキストエリア選択のゲッターとセッターの拡張機能を作成しています。これが私のコードの書き方です。

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が何であるかを知りません。

オブジェクト全体を拡張したくありません。さて、それは私がする最後のことですが、私はそれを回避したいと思います。関数get_selection_rangeとset_selection_rangeは大丈夫です、何が入っているか尋ねないでください、あなたはすでにそれを数回見ました。

したがって、問題は次のとおりです。IE7のJSで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
}
4

2 に答える 2

0

いいえ。最近IE9と戦っていましたが、HTML5モードに切り替えることでIE9を機能させることができました。
IE7は古すぎてサポートできないと思います。

とにかく、このステートメントをページの上部に配置してみてください。

<!doctype HTML>

編集:そしてここでこの答えをチェックしてください:IE7のElement.prototype?

于 2012-09-12T07:04:16.660 に答える
0

一部のブラウザではそうではないことにすでに気付いているので、これらのオブジェクトがグローバルに定義されていることに依存しないでください。

于 2012-09-12T07:28:09.600 に答える