En la mayoría de los navegadores, esto se puede lograr utilizando variaciones propietarias en la user-select
propiedad CSS , originalmente propuesta y luego abandonada en CSS 3 y ahora propuesta en CSS UI Nivel 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;
}
Para Internet Explorer <10 y Opera <15, deberá usar el unselectable
atributo del elemento que desea que no se pueda seleccionar. Puede configurar esto usando un atributo en HTML:
<div id="foo" unselectable="on" class="unselectable">...</div>
Lamentablemente, esta propiedad no se hereda, lo que significa que debe colocar un atributo en la etiqueta de inicio de cada elemento dentro del <div>
. Si esto es un problema, podría usar JavaScript para hacer esto de forma recursiva para los descendientes de un elemento:
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"));
Actualización 30 de abril de 2014 : este recorrido del árbol debe volver a ejecutarse cada vez que se agrega un nuevo elemento al árbol, pero según un comentario de @Han es posible evitar esto agregando un mousedown
controlador de eventos que se establece unselectable
en el objetivo del evento. Ver http://jsbin.com/yagekiji/1 para más detalles.
Esto todavía no cubre todas las posibilidades. Si bien es imposible iniciar selecciones en elementos no seleccionables, en algunos navegadores (Internet Explorer y Firefox, por ejemplo) todavía es imposible evitar selecciones que comienzan antes y terminan después del elemento no seleccionable sin hacer que todo el documento sea no seleccionable.