Die Antwort von lepe hat mir bis auf ein paar Dinge gefallen:
- Browser-Sniffing, jQuery oder nicht, ist nicht optimal
- DRY
- Funktioniert nicht im IE8, wenn obj's parent nicht unterstützt createTextRange
- Die Fähigkeit von Chrome, die setBaseAndExtent sollte gehebelt werden (IMO)
- Es wird kein Text ausgewählt, der sich über mehrere DOM-Elemente erstreckt (Elemente innerhalb des "ausgewählten" Elements). Mit anderen Worten, wenn Sie selText auf ein div mit mehreren span-Elementen, wird es no wählen Sie den Text jedes dieser Elemente aus. Das war ein Deal-Breaker für mich, YMMV.
Das habe ich mir ausgedacht, wobei ich mich von der Antwort von lepe habe inspirieren lassen. Ich bin mir sicher, dass man mich auslachen wird, weil es vielleicht ein bisschen plump ist (und eigentlich noch mehr sein könnte, aber ich schweife ab). Aber es funktioniert und vermeidet Browser-Sniffing und Das ist der Punkt .
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;
}
Das war's. Einiges von dem, was Sie sehen, dient der Lesbarkeit und/oder Bequemlichkeit. Getestet auf Mac in den neuesten Versionen von Opera, Safari, Chrome, Firefox und IE. Auch im IE8 getestet. Normalerweise deklariere ich Variablen nur, wenn sie in Codeblöcken benötigt werden, aber jslint schlug vor, sie alle oben zu deklarieren. Ok jslint.
bearbeiten Ich habe vergessen anzugeben, wie man dies mit dem Code des Auftraggebers verbindet:
function SelectText(element) {
$("#" + element).selectText();
}
Prost