W większości przeglądarek można to osiągnąć za pomocą zastrzeżonych odmian user-select
właściwości CSS , pierwotnie zaproponowanych, a następnie porzuconych w CSS 3, a teraz zaproponowanych w CSS UI poziom 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;
}
W przypadku przeglądarki Internet Explorer <10 i Opera <15 musisz użyć unselectable
atrybutu elementu, którego nie można wybrać. Możesz ustawić to za pomocą atrybutu w HTML:
<div id="foo" unselectable="on" class="unselectable">...</div>
Niestety ta właściwość nie jest dziedziczona, co oznacza, że musisz umieścić atrybut w tagu początkowym każdego elementu wewnątrz <div>
. Jeśli jest to problem, możesz zamiast tego użyć JavaScript, aby zrobić to rekurencyjnie dla potomków elementu:
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"));
Aktualizacja 30 kwietnia 2014 r . : Trawersję drzewa należy ponownie uruchomić za każdym razem, gdy do drzewa dodawany jest nowy element, ale z komentarza @Han wydaje się, że można tego uniknąć, dodając moduł mousedown
obsługi zdarzeń, który ustawia obiekt unselectable
docelowy zdarzenie. Szczegółowe informacje można znaleźć na stronie http://jsbin.com/yagekiji/1 .
To wciąż nie obejmuje wszystkich możliwości. Chociaż nie można inicjować selekcji w elementach, których nie można wybrać, w niektórych przeglądarkach (na przykład Internet Explorer i Firefox) nadal nie można zapobiec selekcjom, które rozpoczynają się przed i kończą po elemencie, którego nie można wybrać, bez uniemożliwienia wyboru całego dokumentu.