Javascript: Deaktivieren Sie die Textauswahl

84

Ich verwende Javascript, um die Textauswahl auf meiner Website zu deaktivieren.

Der Code lautet:

<script type="text/JavaScript">

function disableselect(e) {
  return false
}

function reEnable() {
  return true
}

document.onselectstart = new Function ("return false")

if (window.sidebar) {
  document.onmousedown = disableselect
  document.onclick = reEnable
}
</script>

Ein ähnliches Skript finden Sie hier

Auf meinem lokalen Host: Alle Browser (Firefox, Chrome, IE und Safari) funktionieren hervorragend.

Auf meiner Live-Site: Alles in Ordnung, AUSSER Firefox.

Meine Fragen sind:

  1. Hat jemand einen Vorschlag, warum sich Firefox für die Live-Site und den lokalen Host anders verhält? Hinweis: Javascript ist aktiviert.

  2. Vielleicht ist mein Skript zu simpel, deshalb habe ich Folgendes mit GENAU GLEICHEN Ergebnissen versucht

Arpeggio
quelle
4
Lassen Sie mich Ihnen vorschlagen, die Verwendung von Javascript für diesen Fall zu vermeiden. Verwenden Sie einfach CSS. Weitere Informationen zur Textauswahl in CSS finden Sie unter dieser Frage
RienNeVaPlu͢s
Das zweite Skript ist wahrscheinlich zu alt. Entfernen Sie das! Document.all, da ich glaube, dass es die FX-Unterstützung bricht
mplungjan
9
Ich hasse Websites, die das tun. Wenn ich Text kopieren möchte, kann ich Entwickler-Tools öffnen und ihn trotzdem kopieren. Dies ist nur eine unnötige Unannehmlichkeit.
Uylmz
4
Genau wie Reek sagt. Tun Sie dies nur, wenn Sie einen sehr guten Grund dafür haben. Viele Leute möchten vielleicht nur etwas auswählen, um danach zu suchen, oder ein Wörterbuch verwenden, um ein Wort nachzuschlagen. Das zu verbieten ist nur ein Ärger, der die Leute auf lange Sicht von Ihrer Site vertreiben könnte.
Czechnology
1
Erstens hasse ich auch Seiten, die das Auswählen (Text und so weiter) nur zum "Spaß" verbieten, aber ich denke, es ist eine gute Frage, da es einige legitime Gründe gibt, warum man sie deaktivieren möchte ( z. B. um Mausgesten zu implementieren) oder Drag & Drop von Textblöcken in einem Spiel von was auch immer). Natürlich ist es schlecht, JS zu verwenden, um dieses Ziel zu erreichen, aber die CSS-Lösung hat auch ihre Probleme (in einigen Browsern user-selectallein funktioniert dies nicht, es erfordert das Präfix "-vendor-", wie -moz-user-selectund -webkit-user-select, damit es funktioniert müssen alle möglichen Variationen auf none) eingestellt werden.
Cyberknight

Antworten:

207

Verwenden Sie einfach diese CSS-Methode:

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

Die gleiche Antwort finden Sie hier: Wie deaktiviere ich die Hervorhebung der Textauswahl mithilfe von CSS?

Zachrip
quelle
6
Fügen
Ron van der Heijden
Vielen Dank. Das CSS im Body funktionierte in allen Fällen außer im IE. Gibt es eine nette CSS-Lösung, um dieses Problem auch für den Internet Explorer zu lösen? Ich benutze jetzt die Kombination von Js und CSS, um alle Browser abzudecken !! thk u.
Arpeggio
1. Warum wurde diese Antwort nicht als Lösung markiert? ... Sie löst das betreffende Problem auf genaueste und einfachste Weise. 2. Es sollte erwähnt werden, dass diese CSS-Definition auf jedem HTML-Element und nicht nur auf BODY implementiert werden kann.
TheCuBeMan
1
@TheCuBeMan "Benutzerauswahl" ist eine nicht standardmäßige Funktion, und IMO ist daher nicht die beste Lösung.
Ndugger
1
Es ist wahrscheinlich der beste Ansatz - Browser gehen anders damit um, weil es kompliziert ist und sie alle unterschiedliche Einstellungen haben. Sie möchten nämlich die beabsichtigte UX bereitstellen (keine Auswahl), während der Benutzer weiterhin auswählen kann, ob er dies wirklich möchte . Der W3C- Entwurf enthält mehr Notizen, und caniuse zeigt fantastische Unterstützung. Es ist in Ordnung, dass Browser anders damit umgehen - der Benutzer erhält die Erfahrung, die sein bevorzugter Browser bietet.
Shawn Erquhart
24

Ich schreibe eine Schieberegler-UI-Steuerung, um die Drag-Funktion bereitzustellen. Auf diese Weise kann verhindert werden, dass Inhalte beim Ziehen ausgewählt werden:

function disableSelect(event) {
    event.preventDefault();
}

function startDrag(event) {
    window.addEventListener('mouseup', onDragEnd);
    window.addEventListener('selectstart', disableSelect);
    // ... my other code
}

function onDragEnd() {
    window.removeEventListener('mouseup', onDragEnd);
    window.removeEventListener('selectstart', disableSelect);
    // ... my other code
}

Binden Sie startDragan Ihren Dom:

<button onmousedown="startDrag">...</button>

Wenn Sie die Textauswahl für alle Elemente statisch deaktivieren möchten, führen Sie den Code aus, wenn Elemente geladen werden:

window.addEventListener('selectstart', function(e){ e.preventDefault(); });

      
Yi Feng Xie
quelle
2
Dies ist die beste Lösung, da die CSS-Lösung nicht für Divs mit dem contenteditableAttribut funktioniert (z. B. wenn Sie die Textauswahl deaktivieren möchten, während die Größe des Steuerelements mit der Maus des Benutzers geändert wird).
mbomb007
12

Verwenden Sie für JavaScript diese Funktion:

function disableselect(e) {return false}
document.onselectstart = new Function (return false)
document.onmousedown = disableselect

Um die Auswahl zu aktivieren, verwenden Sie Folgendes:

function reEnable() {return true}

und verwenden Sie diese Funktion an einer beliebigen Stelle:

document.onclick = reEnable
Hassan Azimi
quelle
Außer new Function (return false)ist kein gültiger Javascript-Code. Verwenden Sie nur document.onselectstart = disableselect.
Amik
@amik wie wäre es damit: document.oncontextmenu = new Function("return false;");oder dies mit CSS:<body onselectstart="return false">
Hassan Azimi
Ja new Function("return false;")würde funktionieren, ist aber unnötig kompliziert im Vergleich zu dem, disableselectwas Sie bereits haben. onselectstart="return false"würde auch funktionieren, hat aber nichts mit CSS zu tun. Ich habe auch bemerkt, dass der Rest Ihrer Antwort auch falsch ist - die reEnableFunktion würde überhaupt nicht funktionieren.
Amik
@amik haha ​​na ja, in JavaScript ist nichts notwendig, aber wir machen es trotzdem. Natürlich kann der Code überarbeitet werden, aber werfen Sie einen Blick auf die Frage, die Antwort, beantwortet die Frage, ohne zu versuchen, Hausaufgaben zu machen.
Hassan Azimi
Nun, aber SO ist ein Ort für Bildung, daher halte ich es für keine gute Idee, eine Antwort zu geben, die sowohl technisch falsch ist als auch überhaupt nicht erklärt.
Amik
4

Wenn Sie eine HTML-Seite wie diese haben:

    <Körper
    onbeforecopy = "return false"
    ondragstart = "return false" 
    onselectstart = "return false" 
    oncontextmenu = "return false" 
    onselect = "document.selection.empty ()" 
    oncopy = "document.selection.empty ()">

Es gibt eine einfache Möglichkeit, alle Ereignisse zu deaktivieren:

document.write(document.body.innerHTML)

Sie haben den HTML-Inhalt erhalten und andere Dinge verloren.

Bootsoon
quelle
4

Man könnte auch verwenden, funktioniert in allen Browsern einwandfrei, benötigt Javascript:

onselectstart = (e) => {e.preventDefault()}

Beispiel:

onselectstart = (e) => {
  e.preventDefault()
  console.log("nope!")
  }
Select me!


Eine andere Alternative ist das Testen und Deaktivieren von CSS-Unterstützung userSelectoder MozUserSelectfür Firefox.

let FF
if (CSS.supports("( -moz-user-select: none )")){FF = 1} else {FF = 0}
(FF===1) ? document.body.style.MozUserSelect="none" : document.body.style.userSelect="none"
Select me!


Reine CSS, gleiche Logik. Warnung: Sie müssen diese Regeln auf jeden Browser ausweiten. Dies kann ausführlich sein.

@supports (user-select:none) {
  div {
    user-select:none
  }
}

@supports (-moz-user-select:none) {
  div {
    -moz-user-select:none
  }
}
<div>Select me!</div>

NVRM
quelle
0

Einfach Kopieren Sie diesen Text und setzen Sie den vorherigen ein </body>

function disableselect(e) {
  return false
}

function reEnable() {
  return true
}

document.onselectstart = new Function ("return false")

if (window.sidebar) {
  document.onmousedown = disableselect
  document.onclick = reEnable
}
Hasan Sheikh
quelle