我喜欢lepe的回答,除了几件事:
浏览器嗅探,不管有没有jQuery都不是最佳选择
干
如果obj的父对象不支持createTextRange,则在IE8中无法工作
Chrome的能力使用setbaseanddextent应该被利用(IMO)
不会选择跨越多个DOM元素(“选定”元素中的元素)的文本。换句话说,如果在包含多个span元素的div上调用selText,它将不会选择每个元素的文本。这对我来说是一个致命伤,YMMV。
这是我想到的,并向麻风病的答案致敬。我相信我会被嘲笑,因为这可能有点笨拙(实际上可能更严重,但我跑题了)。但它有效,避免了浏览器嗅探,这就是重点。
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();
}
干杯