我正在为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
}
答案 0 :(得分:0)
没有。 我最近和IE9打架,然后通过切换到HTML5模式让它工作 我猜IE7太老了,不能以任何方式支持它。
无论如何,尝试将此声明放在页面顶部:
<!doctype HTML>
编辑:并在此处查看此答案:Element.prototype in IE7?
答案 1 :(得分:0)
您不应该依赖这些对象进行全局定义,因为您已经注意到在某些浏览器中它们不是。