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

Der Muffin-Mann
quelle
Mögliches Duplikat von stackoverflow.com/questions/2700000/…
Kapa
ein weiteres mögliches Duplikat stackoverflow.com/questions/2326004/prevent-selection-in-html
Javi R

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;
}
kennebec
quelle
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;
});
Robin Daugherty
quelle
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;
Mike
quelle
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.

AndreaBogazzi
quelle
2
Sie haben jetzt 10 weitere :)
Adaptabi
8

Versuche dies:

document.onselectstart = function()
{
    window.getSelection().removeAllRanges();
};
Alex Pacurar
quelle
1
Versuchen Sie dies: $ ('yourDivSelector'). getSelection (). removeAllRanges ()
Alex Pacurar
1
Das selectstartEreignis ist in Firefox nicht vorhanden.
Tim Down
8

Dies kann mithilfe von CSS in den meisten Browsern und der unselectableErweiterung im IE erreicht werden. Siehe meine Antwort hier: Wie deaktiviere ich die Hervorhebung der Textauswahl mithilfe von CSS?

Tim Down
quelle
Dies ist eine viel bessere Antwort als die akzeptierte, die Veranstaltung vollständig zu umgehen
RTPax
0

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

 <input Value="test" onSelect="blur();">
Mehdi
quelle
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';
Erkki Teedla
quelle