Verhindern Sie die Textauswahl nach einem Doppelklick

294

Ich behandle das dblclick-Ereignis in einem Zeitraum in meiner Web-App. Ein Nebeneffekt ist, dass der Doppelklick Text auf der Seite auswählt. Wie kann ich verhindern, dass diese Auswahl erfolgt?

David
quelle

Antworten:

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

Sie können diese Stile auch auf die Spanne für alle Nicht-IE-Browser und IE10 anwenden:

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+ */
}
Paolo Bergantino
quelle
44
Gibt es eine Möglichkeit, die Auswahl tatsächlich zu verhindern, anstatt die Auswahl nachträglich zu entfernen? Außerdem könnte sich Ihre zweite if-Anweisung zur besseren Lesbarkeit im else befinden.
David
8
Verwenden Sie am besten das Präfix -webkit- (dies ist das bevorzugte Präfix für Webkit-basierte Browser) zusätzlich zu -moz- (und -khtml-, wenn Sie eine große Konqueror-Zielgruppe haben).
Augenlidlosigkeit
3
Dies ist jetzt in IE10 verfügbar, -ms-user-select: none;siehe blogs.msdn.com/b/ie/archive/2012/01/11/… @PaoloBergantino
Zitrone
1
@ TimHarper: Was Javascript-Lösungen betrifft, die eine Bibliothek verwenden, sicher. Ich bin mir nicht sicher, warum das eine Ablehnung rechtfertigt.
Paolo Bergantino
14
Es gibt einen Unterschied zwischen dem Deaktivieren der Auswahl beim Doppelklick und dem vollständigen Deaktivieren. Der erste erhöht die Benutzerfreundlichkeit. Der zweite nimmt ab.
Robo Robok
112

In einfachem Javascript:

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

Oder mit jQuery:

jQuery(element).mousedown(function(e){ e.preventDefault(); });
Tom
quelle
26
Ja, ich habe dies verwendet, um das gleiche Problem zu lösen, das ich hatte (+1), außer dass es anstelle von return falseverwendet wurde, event.preventDefault()das keine anderen Handler tötet, die Sie möglicherweise beim Mousedown haben.
Simon East
2
Dies bricht Textarea Elemente auf der Seite :(
John Ktejik
1
@johnktejik nur wenn elementes sich um einen Textbereich handelt, ja.
fregante
11
Ich würde erwarten, dass dieser Ereignishandler "dblclick" zugewiesen wird - aber das funktioniert nicht, was so seltsam ist. Mit "Mousedown" können Sie natürlich auch keinen Text durch Ziehen auswählen.
Corwin.amber
74

So verhindern Sie die Textauswahl NUR nach einem Doppelklick:

Sie könnten MouseEvent#detailEigentum verwenden. Für Mousedown- oder Mouseup-Ereignisse ist es 1 plus die aktuelle Klickzahl.

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

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

4esn0k
quelle
4
Das ist fantastisch! Funktioniert in Firefox 53.
Zaroth
6
Dies sollte die akzeptierte Antwort sein. Alles andere hier verhindert eine Mausauswahl (oder noch schlimmer), anstatt die Frage von OP " Textauswahl nach Doppelklick verhindern " zu
beantworten
1
Funktioniert auch in Chrome
KS74
1
Funktioniert auch unter IE 11 Windows 10 =). Vielen Dank für das Teilen.
Fernando Vieira
Verwenden Sie (event.detail === 2)diese Option, um NUR Doppelklicks (und keine Dreifachklicks usw.) wirklich zu verhindern
Robin Stewart,
32

FWIW, ich user-select: nonehabe das übergeordnete Element der untergeordneten Elemente festgelegt, die beim Doppelklicken auf das übergeordnete Element nicht ausgewählt werden sollen. Und es funktioniert! Coole Sache ist contenteditable="true", Textauswahl usw. funktioniert immer noch bei den untergeordneten Elementen!

So wie:

<div style="user-select: none">
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
</div>
kyw
quelle
Danke, style="user-select: note"überall zu pfeffern hat das Problem gelöst , das ich zu lösen versuchte :)
esaruoho
Gute CSS-Lösung für Fälle, in denen der Text grundsätzlich nie auswählbar sein soll. Vielen Dank!
Ian Lovejoy
11

Eine einfache Javascript-Funktion, die den Inhalt eines Seitenelements nicht auswählbar macht:

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";
  }
}

quelle
4

Für diejenigen, die eine Lösung für Angular 2+ suchen .

Sie können die mousedownAusgabe der Tabellenzelle verwenden.

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

Und verhindern, wenn die 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 ...
}

Die dblclickAusgabe funktioniert weiterhin wie erwartet.

bvdb
quelle
3

oder auf Mozilla:

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

Auf IE,

document.body.onmousedown = function() { return false; } // valid for any html object as well
José Leal
quelle
5
Diese Lösung erlaubt es überhaupt nicht, Text auszuwählen.
jmav
1
@jmav Sie müssten die Funktionsüberschreibungen auf ein spezifischeres Element als anwenden document.body.
Cypher
2

Alter Thread, aber ich habe eine Lösung gefunden, die meiner Meinung nach sauberer ist, da sie nicht alle an das Objekt gebundenen Elemente deaktiviert und nur zufällige und unerwünschte Textauswahlen auf der Seite verhindert. Es ist unkompliziert und funktioniert gut für mich. Hier ist ein Beispiel; Ich möchte die Textauswahl verhindern, wenn ich mehrmals auf das Objekt mit der Klasse "Pfeil-rechts" klicke:

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

HTH!

nncho
quelle
1

Wenn Sie versuchen, die Auswahl von Text mit einer beliebigen Methode sowie nur mit einem Doppelklick vollständig zu verhindern, können Sie das user-select: noneCSS-Attribut verwenden. Ich habe in Chrome 68 getestet, aber laut https://caniuse.com/#search=user-select sollte es in den anderen aktuellen normalen Benutzerbrowsern funktionieren.

In Chrome 68 wird es verhaltensmäßig von untergeordneten Elementen geerbt und erlaubte nicht die Auswahl des enthaltenen Textes eines Elements, selbst wenn Text ausgewählt wurde, der das Element umgibt und einschließt.

stackuser83
quelle
0

Um IE 8 STRG und UMSCHALT zu verhindern, klicken Sie auf die Textauswahl für ein einzelnes Element

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

So verhindern Sie die Textauswahl im Dokument

window.onload = function(){
  document.onselectstart = function(){
    return false;
  }
}
Rajesh
quelle
-2

Ich hatte das gleiche Problem. Ich habe es gelöst, indem ich zu <a>und hinzufüge onclick="return false;"(damit durch Klicken darauf kein neuer Eintrag zum Browserverlauf hinzugefügt wird).

minhle_r7
quelle