Evitar la selección de texto después de hacer doble clic


294

Estoy manejando el evento dblclick en un lapso en mi aplicación web. Un efecto secundario es que el doble clic selecciona texto en la página. ¿Cómo puedo evitar que ocurra esta selección?

Respuestas:


351
function clearSelection() {
    if(document.selection && document.selection.empty) {
        document.selection.empty();
    } else if(window.getSelection) {
        var sel = window.getSelection();
        sel.removeAllRanges();
    }
}

También puede aplicar estos estilos al intervalo para todos los navegadores que no sean IE e IE10:

span.no_selection {
    user-select: none; /* standard syntax */
    -webkit-user-select: none; /* webkit (safari, chrome) browsers */
    -moz-user-select: none; /* mozilla browsers */
    -khtml-user-select: none; /* webkit (konqueror) browsers */
    -ms-user-select: none; /* IE10+ */
}

44
¿Hay alguna forma de prevenir la selección en lugar de eliminar la selección después del hecho? Además, su segunda declaración if podría estar dentro de else if para una mejor legibilidad.
David

8
Es mejor usar el prefijo -webkit- (este es el prefijo preferido para los navegadores basados ​​en Webkit) además de -moz- (y -khtml- si tiene una gran audiencia de Konqueror).
párpado

3
Esto ahora está disponible en IE10 como -ms-user-select: none;ver blogs.msdn.com/b/ie/archive/2012/01/11/… @PaoloBergantino
limón

1
@TimHarper: En cuanto a las soluciones Javascript que usan una biblioteca, seguro. No estoy seguro de por qué eso justifica un voto negativo.
Paolo Bergantino

14
Hay una diferencia entre desactivar la selección con doble clic y desactivarla por completo. El primero aumenta la usabilidad. El segundo disminuye.
Robo Robok

112

En javascript simple:

element.addEventListener('mousedown', function(e){ e.preventDefault(); }, false);

O con jQuery:

jQuery(element).mousedown(function(e){ e.preventDefault(); });

26
Sí, utilicé esto para resolver el mismo problema que tenía (+1), excepto que en lugar de return falseutilizarlo, event.preventDefault()que no mata a ningún otro controlador que pueda tener en el mousedown.
Simon East

2
Esto rompe los elementos del área de texto en la página :(
john ktejik

1
@johnktejik solo si elementes un área de texto, sí.
fregante

11
Esperaría tener este controlador de eventos asignado a "dblclick", pero eso no funciona, lo cual es muy extraño. Con "mousedown", por supuesto, también se le impide seleccionar texto arrastrando.
corwin.amber

74

Para evitar la selección de texto SOLO después de hacer doble clic:

Podrías usar la MouseEvent#detailpropiedad. Para eventos de mousedown o mouseup, es 1 más el recuento de clics actual.

document.addEventListener('mousedown', function (event) {
  if (event.detail > 1) {
    event.preventDefault();
    // of course, you still do not know what you prevent here...
    // You could also check event.ctrlKey/event.shiftKey/event.altKey
    // to not prevent something useful.
  }
}, false);

Ver https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/detail


44
¡Esto es asombroso! Funciona en Firefox 53.
Zaroth

66
Esta debería ser la respuesta aceptada. Todo lo demás aquí evita cualquier selección de mouse (o peor) en lugar de responder la pregunta de OP " Prevenir la selección de texto después de hacer doble clic "
billynoah

1
También funciona en Chrome
KS74

1
Funciona también en IE 11 Windows 10 =). Gracias por compartir esto.
Fernando Vieira

Úselo (event.detail === 2)para evitar realmente SOLO hacer doble clic (y no hacer triple clic, etc.)
Robin Stewart

32

FWIW, configuré user-select: noneel elemento primario de esos elementos secundarios que no quiero seleccionar de alguna manera cuando hago doble clic en cualquier parte del elemento primario. ¡Y funciona! ¡Lo bueno es que la contenteditable="true"selección de texto, etc. todavía funciona en los elementos secundarios!

Asi como:

<div style="user-select: none">
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
</div>

Gracias, la pimienta en style="user-select: note"todas partes solucionó el problema que estaba tratando de resolver :)
esaruoho

Buena solución solo para CSS para casos en los que básicamente nunca desea que el texto sea seleccionable. ¡Gracias!
Ian Lovejoy

11

Una función Javascript simple que hace que el contenido dentro de un elemento de página no sea seleccionable:

function makeUnselectable(elem) {
  if (typeof(elem) == 'string')
    elem = document.getElementById(elem);
  if (elem) {
    elem.onselectstart = function() { return false; };
    elem.style.MozUserSelect = "none";
    elem.style.KhtmlUserSelect = "none";
    elem.unselectable = "on";
  }
}

4

Para aquellos que buscan una solución para Angular 2+ .

Puede usar la mousedownsalida de la celda de la tabla.

<td *ngFor="..."
    (mousedown)="onMouseDown($event)"
    (dblclick) ="onDblClick($event)">
  ...
</td>

Y prevenir si el detail > 1.

public onMouseDown(mouseEvent: MouseEvent) {
  // prevent text selection for dbl clicks.
  if (mouseEvent.detail > 1) mouseEvent.preventDefault();
}

public onDblClick(mouseEvent: MouseEvent) {
 // todo: do what you really want to do ...
}

La dblclicksalida continúa funcionando como se esperaba.


3

o, en mozilla:

document.body.onselectstart = function() { return false; } // Or any html object

En IE,

document.body.onmousedown = function() { return false; } // valid for any html object as well

55
Esta solución no permite seleccionar texto en absoluto.
jmav

1
@jmav Tendría que aplicar la anulación de la función en un elemento más específico que document.body.
Cypher

2

Hilo antiguo, pero se me ocurrió una solución que creo que es más limpia, ya que no deshabilita cada enlace vinculado al objeto, y solo evita selecciones de texto al azar y no deseadas en la página. Es sencillo y funciona bien para mí. Aquí hay un ejemplo; Quiero evitar la selección de texto cuando hago clic varias veces en el objeto con la clase "flecha derecha":

$(".arrow-right").hover(function(){$('body').css({userSelect: "none"});}, function(){$('body').css({userSelect: "auto"});});

HTH!


1

Si está tratando de evitar por completo la selección de texto por cualquier método, así como solo con un doble clic, puede usar el user-select: noneatributo css. He probado en Chrome 68, pero de acuerdo con https://caniuse.com/#search=user-select , debería funcionar en los otros navegadores de usuario normales actuales.

Comportalmente, en Chrome 68 es heredado por elementos secundarios, y no permitía seleccionar el texto contenido de un elemento incluso cuando se seleccionó el texto que rodea e incluye el elemento.


0

Para evitar IE 8 CTRL y SHIFT, haga clic en la selección de texto en un elemento individual

var obj = document.createElement("DIV");
obj.onselectstart = function(){
  return false;
}

Para evitar la selección de texto en el documento

window.onload = function(){
  document.onselectstart = function(){
    return false;
  }
}

-2

Yo tuve el mismo problema. Lo resolví cambiando <a>y agregando onclick="return false;"(para que al hacer clic en él no se agregue una nueva entrada al historial del navegador).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.