Me gustó la respuesta de Lepe, excepto por algunas cosas:
- El rastreo del navegador, jQuery o no no es óptimo
- SECO
- No funciona en IE8 si el padre de obj no admite createTextRange
- La capacidad de Chrome para usar setBaseAndExtent debe aprovecharse (IMO)
- No seleccionará texto que abarque varios elementos DOM (elementos dentro del elemento "seleccionado"). En otras palabras, si llama a selText en un div que contiene múltiples elementos span, no seleccionará el texto de cada uno de esos elementos. Eso fue un factor decisivo para mí, YMMV.
Esto es lo que se me ocurrió, con un guiño a la respuesta de Lepe en busca de inspiración. Estoy seguro de que seré ridiculizado ya que esto es quizás un poco duro (y en realidad podría ser más, pero me estoy desviando). Pero funciona y evita el rastreo del navegador y ese es el punto .
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;
}
Eso es. Algo de lo que ve es la legibilidad y / o conveniencia. Probado en Mac en las últimas versiones de Opera, Safari, Chrome, Firefox e IE. También probado en IE8. Además, normalmente solo declaro variables si es necesario dentro de los bloques de código, pero jslint sugirió que todas se declaren en la parte superior. Ok jslint.
Editar
Olvidé incluir cómo vincular esto con el código de operación:
function SelectText(element) {
$("#" + element).selectText();
}
Salud