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