Clipboard API-Nutzungsleitfaden mit Claude Code
Erfahren Sie, wie Sie die Clipboard API mit Claude Code verwenden. Mit praktischen Tipps und Codebeispielen.
Benutzererfahrung mit der Clipboard API verbessern
Mit einem Klick Code kopieren oder Rich Text einfügen - die Clipboard API verbessert die Benutzerfreundlichkeit von Webanwendungen erheblich. Mit Claude Code können Sie schnell eine Implementierung erstellen, die Browserkompatibilität und Sicherheit berücksichtigt.
Kopier-Button für Codeblöcke
> Füge einen Kopier-Button zu Codeblöcken hinzu.
> Zeige nach dem Klick ein "Kopiert"-Feedback an.
// components/CopyButton.tsx
import { useState, useCallback } from 'react';
interface CopyButtonProps {
text: string;
}
export function CopyButton({ text }: CopyButtonProps) {
const [copied, setCopied] = useState(false);
const handleCopy = useCallback(async () => {
try {
await navigator.clipboard.writeText(text);
setCopied(true);
setTimeout(() => setCopied(false), 2000);
} catch (err) {
// Fallback
fallbackCopy(text);
setCopied(true);
setTimeout(() => setCopied(false), 2000);
}
}, [text]);
return (
<button
onClick={handleCopy}
className="absolute right-2 top-2 rounded bg-gray-700 px-2 py-1 text-xs text-white
transition-colors hover:bg-gray-600"
aria-label={copied ? 'Kopiert' : 'Code kopieren'}
>
{copied ? '✓ Kopiert' : 'Kopieren'}
</button>
);
}
function fallbackCopy(text: string): void {
const textarea = document.createElement('textarea');
textarea.value = text;
textarea.style.position = 'fixed';
textarea.style.opacity = '0';
document.body.appendChild(textarea);
textarea.select();
document.execCommand('copy');
document.body.removeChild(textarea);
}
Rich Text kopieren
// utils/clipboard.ts
export async function copyRichText(html: string, plainText: string): Promise<void> {
if (!navigator.clipboard?.write) {
fallbackCopy(plainText);
return;
}
const htmlBlob = new Blob([html], { type: 'text/html' });
const textBlob = new Blob([plainText], { type: 'text/plain' });
const item = new ClipboardItem({
'text/html': htmlBlob,
'text/plain': textBlob,
});
await navigator.clipboard.write([item]);
}
// Verwendungsbeispiel: Tabellendaten kopieren
async function copyTableAsHtml(data: string[][]) {
const html = `<table>${data.map(row =>
`<tr>${row.map(cell => `<td>${cell}</td>`).join('')}</tr>`
).join('')}</table>`;
const text = data.map(row => row.join('\t')).join('\n');
await copyRichText(html, text);
}
Aus der Zwischenablage lesen
// Bildverarbeitung beim Einfügen
async function handlePaste(e: ClipboardEvent): Promise<void> {
const items = e.clipboardData?.items;
if (!items) return;
for (const item of items) {
if (item.type.startsWith('image/')) {
e.preventDefault();
const blob = item.getAsFile();
if (blob) {
const url = URL.createObjectURL(blob);
insertImage(url);
}
}
}
}
// Berechtigungsprüfung mit Permissions API
async function checkClipboardPermission(): Promise<boolean> {
try {
const result = await navigator.permissions.query({
name: 'clipboard-read' as PermissionName,
});
return result.state === 'granted' || result.state === 'prompt';
} catch {
return false;
}
}
URL-Kopierfunktion zum Teilen
function ShareUrl({ url, title }: { url: string; title: string }) {
const [copied, setCopied] = useState(false);
const handleCopy = async () => {
await navigator.clipboard.writeText(url);
setCopied(true);
setTimeout(() => setCopied(false), 3000);
};
return (
<div className="flex items-center gap-2 rounded-lg border p-3">
<input
type="text"
value={url}
readOnly
className="flex-1 bg-transparent text-sm outline-none"
/>
<button
onClick={handleCopy}
className="rounded bg-blue-600 px-3 py-1 text-sm text-white hover:bg-blue-700"
>
{copied ? 'Kopiert!' : 'URL kopieren'}
</button>
</div>
);
}
Sicherheitsaspekte
// Einfügen mit Bereinigung
function sanitizePastedContent(html: string): string {
const div = document.createElement('div');
div.innerHTML = html;
// Script-Tags entfernen
div.querySelectorAll('script, iframe, object, embed').forEach(el => el.remove());
// Event-Handler-Attribute entfernen
div.querySelectorAll('*').forEach(el => {
Array.from(el.attributes)
.filter(attr => attr.name.startsWith('on'))
.forEach(attr => el.removeAttribute(attr.name));
});
return div.innerHTML;
}
Zusammenfassung
Durch den Einsatz der Clipboard API können Sie die UX von Funktionen wie Code-Block-Kopieren und Teilen erheblich verbessern. Mit Claude Code ist eine robuste Implementierung einschließlich Fallback-Verarbeitung und Sicherheitsmaßnahmen möglich. In Kombination mit der Web Share API können Sie noch flexiblere Sharing-Funktionen anbieten. Vergessen Sie auch nicht die Performance-Optimierung. Die detaillierte Spezifikation finden Sie in den MDN Web Docs.
Related Posts
10 Tipps, um Ihre Produktivität mit Claude Code zu verdreifachen
Entdecken Sie 10 praktische Tipps, um mehr aus Claude Code herauszuholen. Von Prompt-Strategien bis zu Workflow-Abkürzungen — diese Techniken steigern Ihre Effizienz ab sofort.
Canvas/WebGL-Optimierung mit Claude Code
Erfahren Sie, wie Sie Canvas/WebGL mit Claude Code optimieren. Mit praktischen Tipps und Codebeispielen.
Markdown Implementation with Claude Code
Learn about markdown implementation using Claude Code. Practical tips and code examples included.