我喜歡萊佩的答案,除了幾件事情:
- 瀏覽器嗅探,jQuery或不是最優
- DRY
- 不IE8中工作如果obj的家長不支持的createTextRange
- Chrome的使用setBaseAndExtent能力應該加以利用(IMO)
- 將不會選擇文本跨多個DOM元素跨越(內要素「選定」元素)。換句話說,如果您在包含多個跨度元素的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();
}
乾杯
注意:這與jQuery 1.3.2一起工作...不確定它是否能在1.4.x中工作 – Jason 2010-02-05 23:09:50
在Firefox中與jQuery 1.4.3不兼容。 – Cerin 2011-04-06 15:41:01