Wie kann ich die Auswahl von Text / Elementen durch Ziehen des Cursors verhindern?


81

Ich habe ein Paging-Steuerelement erstellt und festgestellt, dass es beim Klicken auf die Schaltflächen sehr einfach ist, versehentlich die einzelnen Bilder und Texte auszuwählen. Kann man das verhindern?

Zur Verdeutlichung der Auswahl meine ich das Hervorheben mit der Maus. (Ziehen Sie die Maus von einer Seite des Bildschirms zur anderen.)

Wenn Sie versuchen, den Text / die Steuerelemente in diesem Raster hervorzuheben, kann er nicht ausgewählt werden. Wie geht das? Verknüpfung



Antworten:


108

Ziehen und Auswählen sowohl bei einem Maus-Down-Ereignis initialisieren als auch bei nachfolgenden Mausbewegungen aktualisieren. Wenn Sie die Ereignisse bearbeiten, um mit dem Ziehen zu beginnen oder der Maus zu folgen, brechen Sie das Sprudeln des Ereignisses ab und überschreiben Sie die Standard-Browser-Rückgabe:

so etwas in deinem fang an, mousedown zu ziehen und handler zu bewegen-

e=e || window.event;
pauseEvent(e);
function pauseEvent(e){
    if(e.stopPropagation) e.stopPropagation();
    if(e.preventDefault) e.preventDefault();
    e.cancelBubble=true;
    e.returnValue=false;
    return false;
}

11
Ja, e.preventDefault () sollte alles sein, was Sie in modernen Browsern benötigen. Der Rest des Codes ist redundant: window.event ist für ältere Versionen des IE vorgesehen, aber da diese Ereignisse nicht über die Methode präventDefault verfügen und die Rückgabe false beim Funktionsaufruf pauseEvent nicht zurückgegeben wird, wird nichts unternommen (nicht einmal im Jahr 2011).
Sjeiti

17
CSS: user-select: none;ist was ich benutze. JS muss das nicht mehr lösen, denke ich
Drenai

50

Zum Ziehen erfassen Sie die Ereignisse mousedownund mousemove. (Und hoffentlich touchstartund touchmoveVeranstaltungen sowie zur Unterstützung Touch - Interfaces.)

Sie müssen event.preventDefault()sowohl die downals auch die moveEreignisse aufrufen , damit der Browser keinen Text auswählt.

Zum Beispiel (mit jQuery):

var mouseDown = false;
$(element).on('mousedown touchstart', function(event) {
  event.preventDefault();
  mouseDown = true;
});
$(element).on('mousemove touchmove', function(event) {
  event.preventDefault();
  if(mouseDown) {
    // Do something here.
  }
});
$(window.document).on('mouseup touchend', function(event) {
  // Capture this event anywhere in the document, since the mouse may leave our element while mouse is down and then the 'up' event will not fire within the element.
  mouseDown = false;
});

Danke Robin, aus Neugier gibt es einen Unterschied zwischen window.documentund windowoder nur document? Ich bin mir ziemlich sicher, documentist ein Kind von window..
The Muffin Man

1
windowist der äußerste Bereich, in dem Javascript im Browser ausgeführt wird. Daher ist jede Variable, die nicht in einer Funktion deklariert ist, eine Eigenschaft von window. Eine documentdirekte Referenzierung bezieht sich tatsächlich auf window.document.
Robin Daugherty

3
Soweit ich das beurteilen kann, reicht es aus, die Standardeinstellung nur für das Ereignis "Mousedown" abzubrechen.
Tremby

23

Dies ist ein sehr alter Beitrag. Es kann nicht genau diese Situation beantworten, aber ich benutze CSS für meine Lösung:

-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;

Dies war genau das, was ich brauchte
Luc-Olsthoorn

19

Ich wollte einen Kommentar abgeben, aber ich habe nicht genug Ruf. Die Verwendung der vorgeschlagenen Funktion von @kennebec löste mein Problem in meiner Javascript-Dragging-Bibliothek. Es funktioniert einwandfrei.

function pauseEvent(e){
    if(e.stopPropagation) e.stopPropagation();
    if(e.preventDefault) e.preventDefault();
    e.cancelBubble=true;
    e.returnValue=false;
    return false;
}

Ich habe es in meiner benutzerdefinierten Mousedown- und Mousemove-Funktion aufgerufen, unmittelbar nachdem ich erkannt habe, dass ich auf das richtige Element geklickt habe. Wenn ich es nur über der Funktion aufrufe, töte ich einfach jeden Klick auf das Dokument. Meine Funktion ist als Ereignis auf document.body registriert.


2
Sie haben jetzt 10 weitere :)
Adaptabi

8

Versuche dies:

document.onselectstart = function()
{
    window.getSelection().removeAllRanges();
};

1
Versuchen Sie dies: $ ('yourDivSelector'). getSelection (). removeAllRanges ()
Alex Pacurar

1
Das selectstartEreignis ist in Firefox nicht vorhanden.
Tim Down


0

Verhindern Sie dies einfach, indem Sie die Funktion blur () aufrufen, wenn Sie Folgendes auswählen:

 <input Value="test" onSelect="blur();">

0

Wenn Sie die Textauswahl für ein bestimmtes Element mithilfe von JavaScript blockieren müssen, war es für mich die einfachste Methode, den userSelect-Stil wie folgt zuzuweisen:

var myElement = document.createElement('div');
myElement.style.userSelect = 'none';
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.