Tôi thích câu trả lời của lepe ngoại trừ một vài điều:
- Trình duyệt đánh hơi, jQuery hoặc không tối ưu
- KHÔ
- Không hoạt động trong IE8 nếu cha mẹ của obj không hỗ trợ createdTextRange
- Khả năng sử dụng setBaseAndExtent của Chrome cần được tận dụng (IMO)
- Sẽ không chọn văn bản trải dài trên nhiều phần tử DOM (các phần tử trong phần tử "được chọn"). Nói cách khác, nếu bạn gọi selText trên div chứa nhiều phần tử span, nó sẽ không chọn văn bản của từng phần tử đó. Đó là một công cụ đối phó với tôi, YMMV.
Đây là những gì tôi nghĩ ra, với một cái gật đầu để trả lời cho cảm hứng. Tôi chắc chắn tôi sẽ bị chế giễu vì điều này có lẽ hơi nặng tay (và thực sự có thể là moreso nhưng tôi lạc đề). Nhưng nó hoạt động và tránh trình duyệt đánh hơi và đó là điểm chính .
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;
}
Đó là nó. Một số trong những gì bạn thấy là dễ đọc và / hoặc thuận tiện. Đã thử nghiệm trên Mac trong các phiên bản mới nhất của Opera, Safari, Chrome, Firefox và IE. Cũng được thử nghiệm trong IE8. Ngoài ra, tôi thường chỉ khai báo các biến nếu / khi cần bên trong các khối mã nhưng jslint đề nghị tất cả chúng được khai báo lên trên cùng. Ok jslint.
Chỉnh sửa
Tôi quên bao gồm cách gắn mã này vào mã của op:
function SelectText(element) {
$("#" + element).selectText();
}
Chúc mừng