Impedir a seleção de texto após clique duplo


294

Estou lidando com o evento dblclick em um período no meu aplicativo da web. Um efeito colateral é que o clique duplo seleciona o texto na página. Como posso impedir que essa seleção aconteça?

Respostas:


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

Você também pode aplicar esses estilos à extensão de todos os navegadores que não sejam do 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
Existe alguma maneira de realmente impedir a seleção, em vez de remover a seleção após o fato? Além disso, sua segunda declaração if poderia estar dentro do else, para melhor legibilidade.
1919 David

8
É melhor usar o prefixo -webkit- (este é o prefixo preferido para navegadores baseados no Webkit), além de -moz- (e -khtml- se você tiver um grande público do Konqueror).
Eyelidlessness 14/10/09

3
Isto está agora disponível em IE10 como -ms-user-select: none;ver blogs.msdn.com/b/ie/archive/2012/01/11/... @PaoloBergantino
limão

1
@ TimHarper: Quanto às soluções Javascript usando uma biblioteca, com certeza. Não sei ao certo por que isso justifica um voto negativo.
Paolo Bergantino

14
Há uma diferença entre desativar a seleção com um clique duplo e desativá-la completamente. O primeiro aumenta a usabilidade. O segundo diminui.
Robo Robok

112

Em javascript simples:

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

Ou com jQuery:

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

26
Sim, eu usei isso para resolver o mesmo problema que estava tendo (+1), exceto em vez de return falseusado, event.preventDefault()que não mata nenhum outro manipulador que você possa ter na ratoeira.
Simon East

2
Isso quebra os elementos da área de
texto

1
@johnktejik apenas se elementfor uma área de texto, sim.
Fregante

11
Esperaria ter esse manipulador de eventos atribuído a "dblclick" - mas isso não funciona, o que é tão estranho. Com "mousedown", é claro que você também não pode selecionar texto arrastando.
Corwin.amber 31/03

74

Para impedir a seleção de texto SOMENTE após um clique duplo:

Você poderia usar a MouseEvent#detailpropriedade. Para eventos de redução de mouse ou mouse, é 1 mais a contagem atual de cliques.

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

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


4
Isso é incrível! Funciona no Firefox 53.
Zaroth 28/06

6
Essa deve ser a resposta aceita. Tudo o resto aqui, evita qualquer seleção do mouse (ou pior) em vez de responder à pergunta de OP " seleção de texto Prevent depois clique duplo "
billynoah

1
Também funciona no Chrome
KS74 21/09/19

1
Funciona também no IE 11 Windows 10 =). Obrigado por compartilhar isso.
Fernando Vieira

Use (event.detail === 2)para realmente impedir APENAS clique duplo (e não clique três vezes etc.)
Robin Stewart

32

FWIW, defino user-select: noneo elemento pai desses elementos filhos que não quero que sejam selecionados de alguma maneira ao clicar duas vezes em qualquer lugar no elemento pai. E funciona! Coisa legal écontenteditable="true" seleção de textos e etc. ainda funciona nos elementos filho!

Assim como:

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

Obrigado, salpicar style="user-select: note"todos os lugares resolveu o problema que eu estava tentando resolver :)
esaruoho 31/01

Ótima solução somente em CSS para casos em que você basicamente nunca deseja que o texto seja selecionável. Obrigado!
Ian Lovejoy

11

Uma função Javascript simples que torna o conteúdo dentro de um elemento da página não selecionável:

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 quem procura uma solução para o Angular 2+ .

Você pode usar a mousedownsaída da célula da tabela.

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

E previna se o 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 ...
}

A dblclicksaída continua a funcionar como esperado.


3

ou, no mozilla:

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

No IE,

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

5
Esta solução não permite a seleção de texto.
jmav

1
@jmav Você precisaria aplicar as substituições de função em um elemento mais específico que document.body.
Cypher

2

Segmento antigo, mas encontrei uma solução que acredito ser mais limpa, pois não desativa todos os objetos vinculados ao objeto e apenas impede seleções de texto aleatórias e indesejadas na página. É simples e funciona bem para mim. Aqui está um exemplo; Quero impedir a seleção de texto quando clicar várias vezes no objeto com a classe "seta à direita":

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

HTH!


1

Se você estiver tentando impedir completamente a seleção de texto por qualquer método, bem como apenas com um clique duplo, poderá usar o user-select: noneatributo css. Eu testei no Chrome 68, mas de acordo com https://caniuse.com/#search=user-select, ele deve funcionar nos outros navegadores de usuário normais atuais.

Comportamental, no Chrome 68, ele é herdado por elementos filho e não permite selecionar o texto contido em um elemento, mesmo quando o texto ao redor e incluindo o elemento foi selecionado.


0

Para impedir IE 8 CTRL e SHIFT, clique na seleção de texto no elemento individual

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

Para impedir a seleção de texto no documento

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

-2

Eu tive o mesmo problema. Eu o resolvi mudando para <a>e adicionando onclick="return false;"(para que clicar nele não adicione uma nova entrada ao histórico do navegador).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.