Kopieren & Einfügen & Das Web

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Haben Sie jemals versucht, Text zu kopieren und einzufügen, nur um festzustellen, dass es frustrierend, umständlich oder sogar unmöglich ist? Ich wette, das haben Sie. Das ist kein Zufall. Im Web haben Sie eine beträchtliche Kontrolle darüber. Lassen Sie uns ein paar Dinge als Denkanstoß darlegen.

Nicht wirklich Text

Vielleicht ist das das offensichtlichste Problem, also wollen wir uns nicht lange damit aufhalten. Wenn Text im Web „echter Text“ sein kann, tun Sie das bitte. Im Vergleich zu einem Bild von Text ist echter Text zugänglicher, besser indexierbar und nützlicher. Sie können ihn zum Kopieren und Einfügen auswählen!

Versehentliche Überlappungen

Haben Sie schon einmal diesen Effekt gesehen, bei dem Text unten ausblendet? Dies wird oft erreicht, indem ein Verlaufsbild über den Text gelegt wird. Sie können teilweise hindurchsehen, aber dieses Element liegt immer noch über dem Text, was bedeutet, dass Mausinteraktionen auf der Überlappung stattfinden, nicht auf dem Text.

Aufgrund der Überlappung kann ich den gewünschten Text hier nicht richtig auswählen. Schlimmer noch, der Link unten ist nicht klickbar.

In dieser Demo ist die Überlappung ein Pseudoelement, das mit einem Verlauf gefüllt und darüber positioniert ist. Glücklicherweise ist dies weitgehend eine behebbare Situation. pointer-events: none; auf der Überlappung hilft schon sehr. Mit dieser Einstellung werden Zeigerinteraktionen das Element vollständig ignorieren. Klicks gehen direkt hindurch, als wäre es nicht da.

Das ist großartig, außer dass IE 10 keine Zeigerereignisse unterstützt. Wenn Sie sich immer noch darauf verlassen wollten, hat Modernizr v3 einen Test dafür, sodass Sie den Überlagerungseffekt nur anwenden könnten, wenn Sie wissen, dass Zeigerereignisse funktionieren.

Oder, anstatt überhaupt eine Überlagerung, könnten Sie einzelne Zeilen einfärben, um es wie ein Ausblenden aussehen zu lassen, wie in diesem Artikel behandelt.

Das Popup nach der Auswahl

Manche Websites machen ziemlich große Annahmen, nachdem Sie Text ausgewählt haben. Eine übliche ist: OH GUTE JA HALLO HALLO ICH SEHE SIE WOLLEN OFFENSICHTLICH DIESEN TEXT IN SOZIALEN MEDIEN TEILEN LASSEN SIE MICH HELFEN. Nicht jeder ist ein Fan. Abgesehen davon, dass es voreilig und übereifrig ist, kann es beim Screenshot helfen.

Highlighter.js ist eine Bibliothek, die dies allzu leicht macht.

CSS-Steuerung der Auswählbarkeit

Es gibt tatsächlich eine CSS-Eigenschaft, die speziell zur Steuerung der Auswählbarkeit von Text dient: user-select.

.unselectable {
  -webkit-user-select: none;  /* Chrome all / Safari all */
  -moz-user-select: none;     /* Firefox all */
  -ms-user-select: none;      /* IE 10+ */
  user-select: none;          /* Likely future */       
}

Abgesehen von einigen Browser-Eigenheiten ist Text mit dieser Einstellung nicht auswählbar. Das kann sehr nützlich sein, wenn Sie versuchen, eine bessere UX rund um die Auswählbarkeit von Text auf Ihrer Website zu gestalten.

Auf Mobilgeräten erfolgt die Textauswahl im Allgemeinen durch langes Tippen, wodurch einige Textauswahloptionen angezeigt werden. Sie können diesen „Callout“ (und damit die Textauswahl) mit

-webkit-touch-callout: default   /* displays the callout */
-webkit-touch-callout: none      /* disables the callout */

Anderer sichtbarer Text, der nicht kopiert wird

Sie können Text mit dem obigen CSS unauswählbar machen, aber manche Texte sind automatisch nicht auswählbar

Versehentliches Auswählen von Zeilennummern

Manchmal stoßen Sie auf einen Codeblock auf einer Website, den Sie kopieren und einfügen möchten. Nachdem Sie ihn eingefügt haben, stellen Sie fest, dass die Zeilennummern mitgekommen sind.

Das ist eigentlich ziemlich überraschend, da es so aussieht, als müsste man sich schon sehr anstrengen, um das zu erreichen. Wenn wir jetzt wissen, was wir wissen, hätten diese Zeilennummern CSS verwenden können, um sie vom Kopieren abzuhalten. Oder der Code hätte als Liste markiert werden können, um Nummern anzuzeigen, die nicht kopiert werden. Oder es hätten benutzerdefinierte Zähler verwendet werden können, die nicht kopiert werden. Oder Pseudoelemente vor den Zeilen, die nicht kopiert werden (relevanter Artikel).

Der einzige Weg, wie das passieren kann, ist, dass einfach Text direkt in das Element am Anfang der Zeile gesetzt wurde und nichts unternommen wurde, um ihn vom Kopieren abzuhalten. Wahrscheinlich eine ziemlich einfache Lösung, die wir jedem Täter ermutigen könnten, vorzunehmen.

Text (ganz) mit JavaScript auswählen

Formularelemente werden oft dafür verwendet. Wenn Sie Text bereitstellen möchten, der *speziell* zum Kopieren und Einfügen gedacht ist, setzen Sie ihn normalerweise in ein input- oder textarea-Element.

<textarea id="ta">a bunch of text</textarea>

Dann ist es sehr einfach, diesen Text programmgesteuert auszuwählen

var ta = document.getElementById("ta");
ta.focus();
ta.select();

Das kann man bei einem nicht wirklich machen

oder was auch immer. Außerdem, wenn sich ein Benutzer in einem Formularelement befindet, wählt der übliche Befehl „Alles auswählen“ nur den Text innerhalb der Grenzen dieses Elements aus, was ein gutes, erwartetes Verhalten ist.

Wenn Sie das Verhalten wünschen, dass der Text beim Anklicken ausgewählt wird, hier ist eine ziemlich prägnante jQuery-Methode dafür

$('#ta').on("focus", function(e) {
  e.target.select();
  $(e.target).one('mouseup', function(e) {
    e.preventDefault();
  });
});

Der Teil mit mouseup erlaubt, dass der Text nach dem mouseup-Ereignis ausgewählt bleibt. Normalerweise deselektiert mouseup den Text und aktiviert den Cursor.

Ich mag diesen Weg, weil er nicht erzwingt, dass der gesamte Text *egal was* ausgewählt wird (was die Leute nicht mögen), sondern nur beim ersten Fokus. Wenn Sie also nach dem Fokus die Auswahl selbst ändern und nur einen Teil des Textes kopieren möchten, können Sie das tun.

Google Fonts ist hier ein Übeltäter. Wenn Sie nur einen Teil des Textes wollen, Pech gehabt, Sie bekommen alles.

Wenn Sie kein Klick-zum-Auswählen anbieten, macht das manchmal auch Leute unglücklich, also ist es eine Balance. Daher mag ich die oben genannte Fokus-zu-Auswahl-Methode, und dann lass es so sein.

Es gibt noch viel mehr über die Textauswahl mit JavaScript zu wissen, einschließlich Range Selection und Ähnlichem, was ziemlich kompliziert ist und besser für einen anderen Artikel aufgespart wird.

Programmgesteuertes Kopieren in die Zwischenablage

Diese Fähigkeit ist erst kürzlich in JavaScript aufgetaucht. Zum Zeitpunkt des Schreibens nur Chrome und IE. Dies geschieht über document.execCommand('copy');

Es gibt eine ganze Geschichte hier, mit der ich nicht ganz auf dem Laufenden bin. Ich glaube, es war hauptsächlich ein Sicherheitsbedenken, weshalb es in JavaScript unmöglich war. Nicht zu vergessen ein Bedenken wegen Geschmacklosigkeit (wer möchte schon eine Website besuchen, nur um festzustellen, dass seine Zwischenablage manipuliert wurde?). Aus welchem Grund auch immer, es ist wieder verfügbar.

Matt Gaunt bietet einige Beispielcodes

E-Mailen Sie mir an [email protected]

var copyEmailBtn = document.querySelector('.js-emailcopybtn');  
copyEmailBtn.addEventListener('click', function(event) {  
  // Select the email link anchor text  
  var emailLink = document.querySelector('.js-emaillink');  
  var range = document.createRange();  
  range.selectNode(emailLink);  
  window.getSelection().addRange(range);  
    
  try {  
    // Now that we've selected the anchor text, execute the copy command  
    var successful = document.execCommand('copy');  
    var msg = successful ? 'successful' : 'unsuccessful';  
    console.log('Copy email command was ' + msg);  
  } catch(err) {  
    console.log('Oops, unable to copy');  
  }  
    
  // Remove the selections - NOTE: Should use   
  // removeRange(range) when it is supported  
  window.getSelection().removeAllRanges();  
});

Das Kopieren von Text in die Zwischenablage war schon immer ein Wunsch. Wir mussten früher Flash verwenden, typischerweise eine Bibliothek namens ZeroClipboard. Hier ist ein Tutorial von David Walsh dazu.

Wie man mit/ohne Stil/Formatierung einfügt

Wenn Sie Text kopieren, wird er im Allgemeinen mit Formatierung übernommen.

Auf Macs gibt es jedoch den Befehl **Einfügen und Stil anpassen**, der *sehr* nützlich sein kann, um diese Formatierung zu entfernen, wenn Sie sie nicht möchten. Zum Beispiel beim Einfügen in eine E-Mail. Die übliche Tastenkombination dafür ist Command-Shift-V.

Nebenbemerkung: Beachten Sie das Rechtsklicken, das ich hier zum Kopieren mache. Manche Benutzer tun das. Das Deaktivieren des Rechtsklickens (wie Sie es in JavaScript können) ist eine Behinderung für diese Benutzer, die es zu vermeiden gilt.

Ich bevorzuge im Allgemeinen dieses Verhalten, also habe ich das gemacht, indem ich es auf Command-V abgebildet habe (was das normale Einfügen überschreibt).

Sie können immer noch mit Formatierung über die Menüs einfügen, wenn Sie müssen.

Zusätzlicher Müll in der Zwischenablage

Haben Sie jemals Text von einer Website ausgewählt, nur um festzustellen, dass am Ende Ihrer Auswahl zusätzlicher Müll angehängt wurde, wenn Sie ihn einfügen? LESEN SIE MEHR UNTER FART-KNUCKLE.BUSINESS!!!

Tun Sie das nicht.

Ungeschickte beibehaltene Großschreibung

Sie können Text in CSS mit text-transform: uppercase; großschreiben. Dies führt jedoch zu einem ziemlich großen (nervigen) Funktionsunterschied beim Kopieren und Einfügen zwischen den Browsern.

Nachdem ich schnell getestet habe

  • Firefox und IE **beachten den ursprünglichen Text** (was im DOM steht).
  • Chrome, Safari, Opera und iOS **beachten die CSS**-Großschreibung.

Ich bevorzuge ersteres.

Block-Links können das Kopieren erschweren

In HTML5 haben wir gelernt, dass wir nun Anker-Tags um alles wickeln können, was wir wollen. Auch wenn sie Inline-Elemente sind, können wir sie ohne Bedenken wegen Ungültigkeit um Blöcke wickeln. Dies geschieht nicht ohne Konsequenzen.

Titel

Dies macht den gesamten Blocktitel ohne CSS-Unterstützung zu einem Link, macht den Titel aber etwas schwerer zu kopieren. Wenn man diese Markup-Struktur um eine Überschrift legt und h3 &gt; a { display: block; } verwendet, wird es etwas einfacher, vorausgesetzt, die h3 hat etwas Padding, da man dann die Auswahl im Padding beginnen und sich bewegen kann.

Einerseits gibt es also eine größere Klickfläche, andererseits ist es etwas schwieriger zu kopieren (wenn Sie ein normaler Rechts-nach-links-Kopierer sind). Ihre Entscheidung.

Siehe den Pen Block titles kinda hard to copy von Chris Coyier (@chriscoyier) auf CodePen.

Manchmal kann die Blockstruktur selbst ärgerliche Situationen verursachen. Wie hier, Sie versuchen einen Filmtitel auszuwählen, aber ein Pixel zu weit und Sie erhalten einen Haufen seltsamen Textes an völlig unzusammenhängenden Positionen

Das ist hier kein riesiges Problem, da die Leute daran gewöhnt sind und wissen, wie sie zurücktreten und bekommen, was sie brauchen. Aber es ist erwähnenswert. Selbst Dinge wie die Flexbox-Sortierung können die Textauswahl völlig verändern, auch wenn visuell alles identisch aussieht.

Siehe den Pen flex ordering and selection von Chris Coyier (@chriscoyier) auf CodePen.

In die Konsole einfügen

Klassischer Anfängerfehler: Das „$ “ am Anfang von Konsolenbefehlen in Blogbeiträgen über die Durchführung von Terminalaktionen kopieren. HÄNDE HOCH, Leute. Nur ich? Verdammt. Jedenfalls gibt es eine ziemlich lustige Dotfile-Sache, die Sie warnt, wenn Sie das tun.

Noch mehr?

Haben Sie irgendwelche persönlichen Abneigungen gegen Kopieren und Einfügen oder die Auswahl im Allgemeinen im Web?