私はいくつかのことを除いて、レペの答えが好きでした:
- ブラウザのスニッフィング、jQueryまたはnoは最適ではありません
- ドライ
- objの親がcreateTextRangeをサポートしていない場合、IE8では機能しません
- setBaseAndExtentを使用するChromeの機能を活用する必要があります(IMO)
- 複数のDOM要素(「選択された」要素内の要素)にまたがるテキストは選択しません。つまり、複数のスパン要素を含むdivでselTextても、それらの各要素のテキストは選択されません。それは私にとって、YMMVにとっての決断でした。
これが私が思いついたもので、インスピレーションを得るためにlepeの答えにうなずきます。これはおそらく少し強引なため、私はあざけられるだろうと確信しています(実際にはもっと難しいかもしれませんが、私は脱線します)。しかし、それは機能し、ブラウザのスニッフィングを回避し、それがポイントです。
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;
}
それでおしまい。あなたが見るもののいくつかは読みやすさおよび/または利便性のためです。Opera、Safari、Chrome、Firefox、IEの最新バージョンのMacでテスト済み。IE8でもテスト済み。また、私は通常、コードブロック内で必要な場合にのみ変数を宣言しますが、jslintはすべてを上で宣言することを提案しました。OK jslint。
編集する
これをopのコードに結び付ける方法を含めるのを忘れていた:
function SelectText(element) {
$("#" + element).selectText();
}
乾杯