Skip to content

Instantly share code, notes, and snippets.

@ulrischa
Created October 29, 2024 18:54
Show Gist options
  • Select an option

  • Save ulrischa/790e10fca5051fec978a61a5bf031262 to your computer and use it in GitHub Desktop.

Select an option

Save ulrischa/790e10fca5051fec978a61a5bf031262 to your computer and use it in GitHub Desktop.
Gist erstellt über Bookmarklet
Der Fehler "Failed to execute `readText` on `Clipboard`: Document is not focused" tritt auf, wenn das Bookmarklet versucht, auf die Zwischenablage zuzugreifen, während das Dokument (d.h. die Browser-Seite) nicht im Vordergrund ist. Diese Sicherheitsvorkehrung stellt sicher, dass ein Skript nur dann auf die Zwischenablage zugreifen kann, wenn der Nutzer mit der Seite interagiert.
Um das Bookmarklet erfolgreich zu verwenden, müssen wir sicherstellen, dass der Browser im Vordergrund ist, und wir können eine alternative Eingabemethode als Fallback einbauen, falls der Zugriff auf die Zwischenablage nicht erlaubt ist.
Hier ist die aktualisierte Version des Bookmarklets, die den Nutzer auffordert, den Text manuell einzugeben, wenn der direkte Zugriff auf die Zwischenablage fehlschlägt:
```javascript
javascript:(async()=>{const githubToken='DEIN_GITHUB_TOKEN_HIER';const gistDescription='Gist erstellt über Bookmarklet';try{let clipboardText='';try{clipboardText=await navigator.clipboard.readText();}catch(e){clipboardText=prompt('Zwischenablagezugriff fehlgeschlagen. Bitte füge deinen Code hier ein:');if(!clipboardText){alert('Kein Text eingegeben. Vorgang abgebrochen.');return;}}if(!clipboardText){alert('Die Zwischenablage ist leer oder der Zugriff ist nicht erlaubt.');return;}const detectFileType=(content)=>{if(/^<\?php/.test(content)){return'snippet.php';}else if(/^<!DOCTYPE html>|<html>/i.test(content)){return'snippet.html';}else if(/console\.log|function|let|const|var/.test(content)){return'snippet.js';}else if(/import .* from|React|useState/.test(content)){return'snippet.jsx';}else if(/class .* {/.test(content)){return'snippet.java';}else if(/def |import /.test(content)){return'snippet.py';}else if(/^#!/.test(content)){return'snippet.sh';}else if(/public static void main/.test(content)){return'snippet.java';}else if(/SELECT .* FROM|INSERT INTO/i.test(content)){return'snippet.sql';}else if(/^# .+|^[-*+] .+|(```[a-z]*\n[\s\S]*?```)/m.test(content)){return'snippet.md';}else{return'snippet.txt';}};const gistFilename=detectFileType(clipboardText);const gistData={description:gistDescription,public:true,files:{[gistFilename]:{content:clipboardText}}};const response=await fetch('https://api.github.com/gists',{method:'POST',headers:{'Authorization':`Bearer ${githubToken}`,'Content-Type':'application/json'},body:JSON.stringify(gistData)});if(response.ok){const gistResponse=await response.json();alert(`Gist erfolgreich erstellt: ${gistResponse.html_url}`);}else{const errorResponse=await response.json();alert(`Fehler beim Erstellen des Gists: ${errorResponse.message}`);}}catch(error){alert(`Es gab einen Fehler: ${error.message}`);}})();
```
### Änderungen und Erläuterungen
1. **Zwischenablage-Fallback**:
- Wenn `navigator.clipboard.readText()` fehlschlägt (z.B. wenn das Dokument nicht im Fokus ist), fängt ein `catch`-Block diesen Fehler ab.
- Stattdessen wird der Nutzer aufgefordert, den Text manuell in ein `prompt()`-Fenster einzugeben:
```javascript
clipboardText = prompt('Zwischenablagezugriff fehlgeschlagen. Bitte füge deinen Code hier ein:');
```
- Falls der Nutzer keinen Text eingibt, wird der Vorgang abgebrochen und eine Meldung angezeigt.
2. **Fallback-Nutzeraufforderung**:
- Das `prompt()`-Fenster stellt sicher, dass der Nutzer die Möglichkeit hat, den Code trotzdem zu speichern, auch wenn der automatische Zugriff auf die Zwischenablage nicht möglich ist.
- Das Bookmarklet kann dadurch in mehr Kontexten nützlich sein, auch wenn die Sicherheitsvorkehrungen des Browsers den direkten Zugriff auf die Zwischenablage blockieren.
3. **Sicherheitsaspekte**:
- Der Zugriff auf die Zwischenablage erfordert Benutzerinteraktion, d.h. der Nutzer muss sicherstellen, dass das Browserfenster im Vordergrund ist, oder er muss den Text manuell eingeben.
- Dieses Vorgehen respektiert die Sicherheitsrichtlinien moderner Browser und stellt sicher, dass keine ungewollten Zugriffe auf sensible Daten stattfinden.
### Verwendung
- Erstelle wie gewohnt ein Lesezeichen und füge den obenstehenden Code als URL ein.
- Wenn der Zugriff auf die Zwischenablage blockiert ist, wirst du zur Eingabe des Textes aufgefordert.
- Dies ermöglicht dir, den Gist trotzdem zu erstellen, auch wenn die standardmäßigen Sicherheitsmaßnahmen des Browsers im Weg sind.
Dieser aktualisierte Ansatz stellt sicher, dass das Bookmarklet in einer breiteren Palette von Szenarien funktioniert und den Nutzer aktiv einbezieht, wenn automatische Funktionen eingeschränkt sind.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment