Ich mochte Lepes Antwort bis auf ein paar Dinge:
- Browser-Sniffing, jQuery oder nein ist nicht optimal
- TROCKEN
- Funktioniert nicht in IE8 , wenn obj der Eltern nicht unterstützt createtext
- Die Fähigkeit von Chrome, setBaseAndExtent zu verwenden, sollte genutzt werden (IMO).
- Wählt keinen Text aus, der sich über mehrere DOM-Elemente erstreckt (Elemente innerhalb des "ausgewählten" Elements). Mit anderen Worten, wenn Sie selText für ein div aufrufen, das mehrere span-Elemente enthält, wird nicht der Text jedes dieser Elemente ausgewählt. Das war ein Deal-Breaker für mich, YMMV.
Hier ist, was ich mir ausgedacht habe, mit einer Anspielung auf Lepes Antwort zur Inspiration. Ich bin mir sicher, dass ich verspottet werde, da dies vielleicht ein bisschen hartnäckig ist (und eigentlich mehr sein könnte, aber ich schweife ab). Aber es funktioniert und vermeidet Browser-Schnüffeln 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 ist es. Sie sehen unter anderem die Lesbarkeit und / oder Bequemlichkeit. Getestet auf Mac in den neuesten Versionen von Opera, Safari, Chrome, Firefox und IE. Auch in IE8 getestet. Außerdem deklariere ich Variablen normalerweise nur, wenn / 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 dies mit dem Code der Operation verknüpft werden soll:
function SelectText(element) {
$("#" + element).selectText();
}
Prost