J'ai aimé la réponse de Lepe, sauf pour certaines choses :
- Le reniflage du navigateur, jQuery ou pas, n'est pas optimal.
- SEC
- Ne fonctionne pas dans IE8 si le parent de l'objet ne supporte pas l'option createTextRange
- La capacité de Chrome à utiliser setBaseAndExtent doit être optimisé (IMO)
- Ne sélectionne pas le texte qui s'étend sur plusieurs éléments du DOM (éléments dans l'élément "sélectionné"). En d'autres termes, si vous appelez selText sur un div contenant plusieurs éléments span, il va no sélectionner le texte de chacun de ces éléments. C'était un obstacle pour moi, mais je ne suis pas sûr.
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 vais être ridiculisé car c'est peut-être un peu lourd (et pourrait l'être davantage, mais je m'égare). Mais ça marche et ça évite de renifler le navigateur et d'avoir des problèmes de sécurité. c'est le but .
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 tout. Une partie de ce que vous voyez l'est pour des raisons de lisibilité et/ou de commodité. Testé sur Mac dans les dernières versions d'Opera, Safari, Chrome, Firefox et IE. Testé également dans IE8. En outre, je ne déclare généralement les variables que si/quand elles sont nécessaires à l'intérieur des blocs de code, mais jslint a suggéré qu'elles soient toutes déclarées en haut. Ok jslint.
Editar J'ai oublié d'inclure le lien avec le code de l'opérateur :
function SelectText(element) {
$("#" + element).selectText();
}
Cheers