Trong hầu hết các trình duyệt, điều này có thể đạt được bằng cách sử dụng các biến thể độc quyền trên thuộc tính CSS user-select
, ban đầu được đề xuất và sau đó bị bỏ rơi trong CSS 3 và hiện được đề xuất trong CSS UI Cấp 4 :
*.unselectable {
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
/*
Introduced in Internet Explorer 10.
See http://ie.microsoft.com/testdrive/HTML5/msUserSelect/
*/
-ms-user-select: none;
user-select: none;
}
Đối với Internet Explorer <10 và Opera <15, bạn sẽ cần sử dụng unselectable
thuộc tính của thành phần bạn muốn không thể chọn. Bạn có thể thiết lập điều này bằng cách sử dụng một thuộc tính trong HTML:
<div id="foo" unselectable="on" class="unselectable">...</div>
Đáng buồn là thuộc tính này không được kế thừa, có nghĩa là bạn phải đặt một thuộc tính vào thẻ bắt đầu của mọi thành phần bên trong <div>
. Nếu đây là một vấn đề, thay vào đó, bạn có thể sử dụng JavaScript để thực hiện điều này một cách đệ quy cho hậu duệ của một thành phần:
function makeUnselectable(node) {
if (node.nodeType == 1) {
node.setAttribute("unselectable", "on");
}
var child = node.firstChild;
while (child) {
makeUnselectable(child);
child = child.nextSibling;
}
}
makeUnselectable(document.getElementById("foo"));
Cập nhật ngày 30 tháng 4 năm 2014 : Chuyển đổi cây này cần được chạy lại bất cứ khi nào một phần tử mới được thêm vào cây, nhưng dường như từ một nhận xét của @Han rằng có thể tránh điều này bằng cách thêm một mousedown
trình xử lý sự kiện đặt unselectable
vào mục tiêu của biến cố. Xem http://jsbin.com/yagekiji/1 để biết chi tiết.
Điều này vẫn không bao gồm tất cả các khả năng. Mặc dù không thể bắt đầu các lựa chọn trong các phần tử không thể chọn, nhưng trong một số trình duyệt (ví dụ Internet Explorer và Firefox), vẫn không thể ngăn các lựa chọn bắt đầu trước và kết thúc sau phần tử không thể chọn mà không làm cho toàn bộ tài liệu không thể chọn.