除了以下几点,我喜欢lepe的回答:
- 浏览器嗅探,jQuery或否不是最佳选择
- 干燥
- 如果obj的父级不支持createTextRange,则在IE8中不起作用
- 应该利用Chrome使用setBaseAndExtent的功能(IMO)
- 将不会选择跨多个DOM元素(“ selected”元素中的元素)的文本。换句话说,如果在包含多个span元素的div上调用selText,它将不会选择每个元素的文本。YMMV对我来说真是个大难题。
这就是我想出的,点头表示lepe的灵感来源。我敢肯定我会被嘲笑的,因为这也许有点笨拙(实际上可能会更多,但是我离题了)。但这有效并且避免了浏览器嗅探,这就是重点。
selectText:function(){
var range,
selection,
obj = this[0],
type = {
func:'function',
obj:'object'
},
// Convenience
is = function(type, o){
return typeof o === type;
};
if(is(type.obj, obj.ownerDocument)
&& is(type.obj, obj.ownerDocument.defaultView)
&& is(type.func, obj.ownerDocument.defaultView.getSelection)){
selection = obj.ownerDocument.defaultView.getSelection();
if(is(type.func, selection.setBaseAndExtent)){
// Chrome, Safari - nice and easy
selection.setBaseAndExtent(obj, 0, obj, $(obj).contents().size());
}
else if(is(type.func, obj.ownerDocument.createRange)){
range = obj.ownerDocument.createRange();
if(is(type.func, range.selectNodeContents)
&& is(type.func, selection.removeAllRanges)
&& is(type.func, selection.addRange)){
// Mozilla
range.selectNodeContents(obj);
selection.removeAllRanges();
selection.addRange(range);
}
}
}
else if(is(type.obj, document.body) && is(type.obj, document.body.createTextRange)) {
range = document.body.createTextRange();
if(is(type.obj, range.moveToElementText) && is(type.obj, range.select)){
// IE most likely
range.moveToElementText(obj);
range.select();
}
}
// Chainable
return this;
}
而已。您看到的一些内容是为了便于阅读和/或方便。在Mac上以Opera,Safari,Chrome,Firefox和IE的最新版本进行了测试。也在IE8中测试。另外,我通常仅在代码块内需要时声明变量,但jslint建议将它们全部声明为最高变量。好的,jslint。
编辑
我忘了包括如何将其绑定到操作码:
function SelectText(element) {
$("#" + element).selectText();
}
干杯