Мне понравился ответ Лепе, за исключением нескольких вещей:
- Обнюхивание браузера, JQuery или нет не является оптимальным
- DRY
- Не работает в IE8, если родительский объект obj не поддерживает createTextRange
- Возможность Chrome использовать setBaseAndExtent должна быть усилена (IMO)
- Не будет выделять текст, охватывающий несколько элементов DOM (элементов внутри «выбранного» элемента). Другими словами, если вы вызовете selText для div, содержащего несколько элементов span, он не будет выделять текст каждого из этих элементов. Для меня это было нарушением соглашения, YMMV.
Вот то, что я придумал, с кивком на ответ Лепе для вдохновения. Я уверен, что меня высмеют, поскольку это, возможно, немного жестко (и на самом деле может быть более, но я отвлекся). Но это работает и избегает перехвата браузера, и в этом суть .
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;
}
Вот и все. Кое-что из того, что вы видите, предназначено для удобства чтения и / или удобства. Протестировано на Mac в последних версиях Opera, Safari, Chrome, Firefox и IE. Также проверено в IE8. Также я обычно объявляю переменные только в том случае, если / когда это необходимо, внутри блоков кода, но jslint предлагает объявить их все вверху. Хорошо, JSLINT.
Редактировать
Я забыл включить, как связать это с кодом операции:
function SelectText(element) {
$("#" + element).selectText();
}
ура