2010-09-27 27 views
19

Tôi có div có thể chỉnh sửa nội dung như bên dưới.chọn tất cả văn bản trong div có thể chỉnh sửa nội dung khi nó tập trung/nhấp vào

<div style=" border:solid 1px #D31444" contenteditable="true">12 some text...</div> 

Điều tôi cần là khi tôi nhấp vào div, tất cả văn bản sẽ tự động được chọn. Bạn có thể cho tôi giải pháp được không?

+0

Câu trả lời này cung cấp cách 'chính xác' nhất để thực hiện những gì bạn muốn: http://stackoverflow.com/a/6150060/2703399 – josh

Trả lời

32

Hãy thử điều này:

<div style=" border:solid 1px #D31444" contenteditable="true" onclick="document.execCommand('selectAll',false,null)">12 some text...</div> 
+6

Điều này sẽ được thực hiện tốt hơn bằng sự kiện 'focus', vì sử dụng sự kiện nhấp chuột sẽ làm nổi bật mọi thứ bất cứ khi nào người dùng cố bấm vào vị trí dấu mũ. –

+1

Vâng, có thể, nhưng điều đó phụ thuộc vào những gì tác giả của câu hỏi muốn. –

+2

Tôi vừa thử tính năng này trong Chrome Version 24.0.1312.57 OS X. Sử dụng jQuery 1.9.1, liên kết với 'focus' _does not_ work. Liên kết với sự kiện 'click' đã chọn văn bản: ' $ ('. Editable'). ('Click', function() {document.execCommand ('selectAll', false, null);}); ' – berto

36

này sẽ làm điều đó. Bộ hẹn giờ có trong Chrome và Safari vì trong các trình duyệt đó, hành vi trình duyệt gốc chọn toàn bộ phần tử dường như kích hoạt sau sự kiện tiêu điểm, do đó sẽ ghi đè hiệu ứng của mã lựa chọn trừ khi bị hoãn cho đến sau sự kiện tiêu điểm:

var div = document.getElementById("editable"); 

div.onfocus = function() { 
    window.setTimeout(function() { 
     var sel, range; 
     if (window.getSelection && document.createRange) { 
      range = document.createRange(); 
      range.selectNodeContents(div); 
      sel = window.getSelection(); 
      sel.removeAllRanges(); 
      sel.addRange(range); 
     } else if (document.body.createTextRange) { 
      range = document.body.createTextRange(); 
      range.moveToElementText(div); 
      range.select(); 
     } 
    }, 1); 
}; 
+1

Không nên có cách nào để làm điều này với ngăn chặnDefault hoặc stopPropagation quá? Sử dụng setTimeout có vẻ xấu xí bởi vì bạn phải phá vỡ ngăn xếp cuộc gọi. – Adam

+1

@Adam: Tôi không nghĩ vậy. Bạn không muốn ngăn phần tử có thể chỉnh sửa nhận được tiêu điểm, vì vậy 'preventDefault()' đã hết. 'stopPropagation()' chỉ dừng sự kiện từ việc truyền sang đích kế tiếp, điều này không hữu ích cho việc này. –

+0

tim, tại sao bạn không phải là người kiểm duyệt? – think123

4

Sự cố với sự kiện focus trên div là sự cố không thể kích hoạt vì nó cho rằng không thể chỉnh sửa div. Nội dung có thể chỉnh sửa trong DOM được đánh dấu bằng tabindex trong nền, do đó, để div của bạn nhận được sự kiện onfocus, bạn cần khai báo rõ ràng thuộc tính 's tabindex. HTML:

<div style=" border:solid 1px #D31444" contenteditable="true" tabindex="1" onfocus="document.execCommand('selectAll',false,null)" >12 some text...</div> 

Điều đó sẽ hoạt động với onfocus.

+0

Làm điều này làm cho nó chọn toàn bộ tài liệu. Bạn có thể sử dụng cùng một mã, nhưng tôi khuyên bạn nên sử dụng 'setTimeout' cho' 150' ms để nó không chọn toàn bộ tài liệu. Hy vọng thứ này sẽ giúp đỡ bạn! –

Các vấn đề liên quan