Impedisci la selezione del testo dopo il doppio clic


294

Sto gestendo l'evento dblclick in un arco di tempo nella mia app Web. Un effetto collaterale è che il doppio clic seleziona il testo sulla pagina. Come posso impedire che questa selezione accada?

Risposte:


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

Puoi anche applicare questi stili all'intervallo per tutti i browser non 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
Esiste un modo per impedire effettivamente la selezione invece di rimuovere la selezione dopo il fatto? Inoltre, la tua seconda istruzione if potrebbe essere dentro l'altro se per una migliore leggibilità.
David,

8
Meglio usare il prefisso -webkit- (questo è il prefisso preferito per i browser basati su Webkit) oltre a -moz- (e -khtml- se hai un vasto pubblico Konqueror).
mancanza di palpebre

3
Questo è ora disponibile in IE10 come -ms-user-select: none;vedi blogs.msdn.com/b/ie/archive/2012/01/11/… @PaoloBergantino
lemon

1
@TimHarper: per quanto riguarda le soluzioni Javascript che usano una libreria, certo. Non sono proprio sicuro del motivo per cui ciò meriti un voto negativo.
Paolo Bergantino,

14
C'è una differenza tra disabilitare la selezione con doppio clic e disabilitarla completamente. Il primo aumenta l'usabilità. Il secondo diminuisce.
Robo Robok,

112

In javascript semplice:

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

O con jQuery:

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

26
Sì, l'ho usato per risolvere lo stesso problema che avevo (+1), tranne invece che return falseusato event.preventDefault()che non uccide altri gestori che potresti avere su Mousedown.
Simon East,

2
Questo rompe gli elementi textarea nella pagina :(
john ktejik

1
@johnktejik solo se elementè una textarea, sì.
fregante,

11
Ci si aspetterebbe che questo gestore eventi fosse assegnato a "dblclick", ma non funziona, il che è così strano. Con "mousedown", ovviamente, ti viene anche impedito di selezionare il testo trascinandolo.
corwin.amber

74

Per impedire la selezione del testo SOLO dopo un doppio clic:

Puoi usare la MouseEvent#detailproprietà. Per gli eventi di mouse o mouseup, è 1 più il conteggio dei clic corrente.

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);

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


4
Questo e spettacolare! Funziona con Firefox 53.
Zaroth,

6
Questa dovrebbe essere la risposta accettata. Tutto il resto qui impedisce qualsiasi selezione del mouse (o peggio) invece di rispondere alla domanda di OP " Impedisci la selezione del testo dopo un doppio clic "
billynoah

1
Funziona anche su Chrome
KS74,

1
Funziona anche su IE 11 Windows 10 =). Grazie per averlo condiviso.
Fernando Vieira,

Utilizzare (event.detail === 2)per impedire davvero SOLO doppio clic (e non triplo clic ecc.)
Robin Stewart,

32

FWIW, ho impostato user-select: nonel' elemento genitore di quegli elementi figlio che non voglio in qualche modo selezionato quando faccio doppio clic in un punto qualsiasi dell'elemento genitore. E funziona! La cosa interessante è che la contenteditable="true"selezione del testo e così via funziona ancora sugli elementi figlio!

Quindi come:

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

Grazie, sbirciare style="user-select: note"ovunque risolto il problema che stavo cercando di risolvere :)
esaruoho

Bella soluzione solo CSS per i casi in cui praticamente non si desidera che il testo sia selezionabile. Grazie!
Ian Lovejoy,

11

Una semplice funzione Javascript che rende il contenuto all'interno di un elemento di pagina non selezionabile:

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

Per chi cerca una soluzione per Angular 2+ .

È possibile utilizzare l' mousedownoutput della cella della tabella.

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

E prevenire se il 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 ...
}

L' dblclickoutput continua a funzionare come previsto.


3

oppure, su Mozilla:

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

Su IE,

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

5
Questo sollution non consente affatto di selezionare il testo.
jmav,

1
@jmav Dovresti applicare le sostituzioni di funzione su un elemento più specifico di document.body.
Cypher,

2

Vecchio thread, ma ho trovato una soluzione che ritengo più pulita in quanto non disabilita tutti i limiti pari all'oggetto e impedisce solo selezioni di testo casuali e indesiderate sulla pagina. È semplice e funziona bene per me. Ecco un esempio; Voglio impedire la selezione del testo quando faccio clic più volte sull'oggetto con la classe "freccia-destra":

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

HTH!


1

Se si sta tentando di impedire completamente la selezione del testo con qualsiasi metodo e solo con un doppio clic, è possibile utilizzare l' user-select: noneattributo css. Ho testato in Chrome 68, ma secondo https://caniuse.com/#search=user-select dovrebbe funzionare negli altri browser degli utenti normali correnti.

Comportamentalmente, in Chrome 68 è ereditato da elementi figlio e non ha permesso di selezionare il testo contenuto di un elemento anche se è stato selezionato il testo circostante e incluso l'elemento.


0

Per impedire IE 8 CTRL e MAIUSC, fare clic sulla selezione del testo sul singolo elemento

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

Per impedire la selezione del testo sul documento

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

-2

Ho avuto lo stesso problema. L'ho risolto passando a <a>e aggiungendo onclick="return false;"(in modo che facendo clic su di esso non aggiunga una nuova voce alla cronologia del browser).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.