Gostei da resposta de lepe, exceto por algumas coisas:
- Detectar o navegador, jQuery ou não, não é o ideal
- SECO
- Não funciona no IE8 se o pai do obj não suportar createTextRange
- Capacidade do Chrome de usar setBaseAndExtent deve ser aproveitada (IMO)
- Não seleciona texto que se estende por vários elementos DOM (elementos dentro do elemento "selecionado"). Em outras palavras, se você chamar selText em uma div contendo vários elementos de amplitude, ele não selecionará o texto de cada um desses elementos. Isso foi um negócio para mim, YMMV.
Aqui está o que eu criei, com um aceno de cabeça para a resposta de Lepe em busca de inspiração. Tenho certeza de que serei ridicularizado, pois isso talvez seja um pouco pesado (e na verdade poderia ser mais, mas eu discordo). Mas funciona e evita farejar o navegador, e esse é o ponto .
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;
}
É isso aí. Parte do que você vê é de legibilidade e / ou conveniência. Testado no Mac nas versões mais recentes do Opera, Safari, Chrome, Firefox e IE. Também testado no IE8. Também normalmente declaro apenas variáveis se / quando necessárias dentro de blocos de código, mas o jslint sugeriu que todas elas fossem declaradas no topo. Ok jslint.
Editar
Eu esqueci de incluir como vincular isso ao código da operação:
function SelectText(element) {
$("#" + element).selectText();
}
Felicidades