我喜欢lepe的答案,但有几点需要注意:
- 无论使用jQuery与否,浏览器嗅探都不是最佳选择
- 避免重复代码
- 如果obj的父元素不支持createTextRange,则在IE8中无法正常工作
- 应该利用Chrome的setBaseAndExtent功能(个人意见)
- 不能选择跨越多个DOM元素的文本(位于“selected”元素内的元素)。换句话说,如果在包含多个span元素的div上调用selText,它将无法选择每个元素的文本。这对我来说是致命的问题,可能会因人而异。
以下是我的解决方案,受到lepe答案的启发。我知道这可能有点过于复杂(实际上可能更复杂,但我不想赘述)。但它有效地避免了浏览器嗅探,这才是关键。
selectText:function(){
var range,
selection,
obj = this[0],
type = {
func:'function',
obj:'object'
},
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)){
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)){
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)){
range.moveToElementText(obj);
range.select();
}
}
return this;
}
就是这样。你看到的一些东西只是为了易读性和/或方便起见。在最新版本的Opera、Safari、Chrome、Firefox和IE中测试过。也在IE8中进行了测试。此外,我通常只在代码块内需要时声明变量,但jslint建议将它们全部声明在顶部。好吧,jslint。
编辑
我忘记如何将其与op的代码联系起来:
function SelectText(element) {
$("#" + element).selectText();
}
干杯