나는 몇 가지를 제외하고 lepe의 대답을 좋아했습니다.
- 브라우저 스니핑, jQuery 또는 최적이 아님
- 마른
- obj의 부모가 createTextRange를 지원하지 않으면 IE8에서 작동하지 않습니다.
- setBaseAndExtent 를 사용하는 Chrome의 기능을 활용해야합니다 (IMO)
- 여러 DOM 요소 ( "selected"요소 내의 요소)에서 텍스트를 선택하지 않습니다. 즉 , 여러 범위 요소를 포함하는 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는 변수가 모두 최상위로 선언되도록 제안했습니다. 좋아 jslint.
편집
이것을 op의 코드에 묶는 방법을 포함시키는 것을 잊었습니다.
function SelectText(element) {
$("#" + element).selectText();
}
건배