Mi è piaciuta la risposta di lepe ad eccezione di alcune cose:
- L'annusamento del browser, jQuery o no non è ottimale
- ASCIUTTO
- Non funziona in IE8 se il genitore di obj non supporta createTextRange
- La capacità di Chrome di utilizzare setBaseAndExtent dovrebbe essere sfruttata (IMO)
- Non selezionerà lo spanning del testo su più elementi DOM (elementi all'interno dell'elemento "selezionato"). In altre parole, se chiami selText su un div contenente più elementi di span, non selezionerà il testo di ciascuno di quegli elementi. Questo è stato un fallimento per me, YMMV.
Ecco cosa mi è venuto in mente, con un cenno alla risposta di lepe per l'ispirazione. Sono sicuro che sarò ridicolizzato perché questo è forse un po 'pesante (e in realtà potrebbe essere moreso ma sto divagando). Ma funziona ed evita l'annusamento del browser e questo è il 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;
}
Questo è tutto. Parte di ciò che vedi è per leggibilità e / o convenienza. Testato su Mac nelle ultime versioni di Opera, Safari, Chrome, Firefox e IE. Testato anche su IE8. Inoltre, in genere dichiaro variabili solo se / quando necessario all'interno di blocchi di codice, ma jslint ha suggerito che fossero tutte dichiarate al top. Ok jslint.
Modifica
Ho dimenticato di includere come legare questo al codice dell'operazione:
function SelectText(element) {
$("#" + element).selectText();
}
Saluti