我喜欢 lepe 的回答,除了几件事:
- 浏览器嗅探、jQuery 或否都不是最佳选择
- 干燥
- 如果 obj 的父级不支持 createTextRange,则在 IE8 中不起作用
- 应该利用 Chrome 使用 setBaseAndExtent 的能力 (IMO)
- 不会选择跨越多个 DOM 元素(“选定”元素中的元素)的文本。换句话说,如果您在包含多个 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();
}
干杯