J'ai aimé la réponse de Lepe sauf pour quelques choses:
- Navigateur reniflant, jQuery ou non n'est pas optimal
- SEC
- Ne fonctionne pas dans IE8 si le parent d'obj ne prend pas en charge createTextRange
- La capacité de Chrome à utiliser setBaseAndExtent devrait être optimisée (IMO)
- Ne sélectionnera pas le texte s'étendant sur plusieurs éléments DOM (éléments au sein de l'élément "sélectionné"). En d'autres termes, si vous appelez selText sur un div contenant plusieurs éléments span, il ne sélectionnera pas le texte de chacun de ces éléments. C'était une rupture pour moi, YMMV.
Voici ce que j'ai trouvé, avec un clin d'œil à la réponse de Lepe pour l'inspiration. Je suis sûr que je serai ridiculisé car c'est peut-être un peu lourd (et pourrait en fait être plus, mais je m'égare). Mais cela fonctionne et évite de flairer le navigateur et c'est le point .
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;
}
C'est ça. Une partie de ce que vous voyez est la lisibilité et / ou la commodité. Testé sur Mac dans les dernières versions d'Opera, Safari, Chrome, Firefox et IE. Également testé dans IE8. De plus, je ne déclare généralement les variables que si / quand cela est nécessaire dans les blocs de code, mais jslint a suggéré qu'elles soient toutes déclarées en haut. Ok jslint.
Modifier
J'ai oublié d'inclure comment lier cela au code de l'op:
function SelectText(element) {
$("#" + element).selectText();
}
À votre santé