Lubiłem odpowiedź Lepe'a z wyjątkiem kilku rzeczy:
- Wąchanie przeglądarki, jQuery lub brak nie jest optymalne
- SUCHY
- Nie działa w IE8, jeśli obiekt nadrzędny obiektu obj nie obsługuje metody createTextRange
- Zdolność Chrome do korzystania z setBaseAndExtent powinna być wykorzystywana (IMO)
- Nie wybierze tekstu obejmującego wiele elementów DOM (elementy w ramach elementu „zaznaczonego”). Innymi słowy, jeśli wywołasz selText na div zawierającym wiele elementów rozpiętości, nie wybierze on tekstu każdego z tych elementów. To było dla mnie przełomowe, YMMV.
Oto, co wymyśliłem, kiwając głową na odpowiedź Lepe'a w poszukiwaniu inspiracji. Jestem pewien, że będę wyśmiewany, ponieważ jest to może trochę ciężkie ręce (i właściwie może to być więcej, ale dygresuję). Ale to działa i unika wąchania przeglądarki i o to właśnie chodzi .
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;
}
Otóż to. Niektóre z nich dotyczą czytelności i / lub wygody. Testowane na komputerach Mac w najnowszych wersjach Opera, Safari, Chrome, Firefox i IE. Testowany również w IE8. Zazwyczaj deklaruję zmienne tylko wtedy, gdy są potrzebne w blokach kodu, ale jslint zasugerował, że wszystkie powinny być zadeklarowane do góry. Ok jslint.
Edytuj
Nie pamiętam, aby dołączyć sposób powiązania tego z kodem operacji:
function SelectText(element) {
$("#" + element).selectText();
}
Twoje zdrowie