Pobrać aktualną zawartość schowka? [Zamknięte]

111

Chciałbym wiedzieć, jak sprawić, by mój skrypt wykrył zawartość schowka i wkleił ją do pola tekstowego po otwarciu strony, bez udziału użytkownika. Jak można to zrobić?

Gabriele Cirulli
źródło
Nie możesz naprawdę wiedzieć, co jest w schowku użytkownika, chyba że użyłeś jakiegoś rodzaju zaplecza flashowego podczas kopiowania tekstu. ------- Aktualizacja: tutaj bardziej poprawna odpowiedź
Naftali aka Neal

Odpowiedzi:

74

window.clipboardData.getData('Text')będzie działać w niektórych przeglądarkach. Jednak wiele przeglądarek, w których to działa, zapyta użytkownika, czy chce, aby strona internetowa miała dostęp do schowka.

Dave
źródło
17
Czy to zadziała w dowolnej przeglądarce innej niż Internet Explorer?
Anderson Green
6
Prawdopodobnie nie. Zobacz to pytanie: stackoverflow.com/questions/400212/…
Dave
7
Możesz sprawdzić kompatybilność tutaj caniuse.com/#search=clipboardData
Sergey Novikov
1
Lepszym rozwiązaniem jest uzyskanie przez obiekt węzła, ale nie przez obiekt okna. Zobacz tutaj
rplaurindo
Martwię się o Keepass i jego bezpieczeństwo. Aplikacja pozwala mi skopiować moje hasła do schowka.
René Winkler
73

Użyj nowego interfejsu API schowka , za pośrednictwem navigator.clipboard. Można go używać w następujący sposób:

navigator.clipboard.readText()
  .then(text => {
    console.log('Pasted content: ', text);
  })
  .catch(err => {
    console.error('Failed to read clipboard contents: ', err);
  });

Lub ze składnią asynchroniczną:

const text = await navigator.clipboard.readText();

Należy pamiętać, że spowoduje to wyświetlenie użytkownikowi okna dialogowego z prośbą o pozwolenie, więc żadne śmieszne interesy nie są możliwe.

Powyższy kod nie zadziała, jeśli zostanie wywołany z konsoli. Działa tylko wtedy, gdy uruchomisz kod na aktywnej karcie. Aby uruchomić kod z konsoli, możesz ustawić limit czasu i szybko kliknąć w oknie witryny:

setTimeout(async () => {
  const text = await navigator.clipboard.readText();
  console.log(text);
}, 2000);

Przeczytaj więcej na temat interfejsu API i użytkowania w dokumentacji Google dla programistów .

Spec

iuliu.net
źródło
18
Zauważ, że wywołanie z konsoli zawsze powoduje błąd. Ale to czyni pracę na bezpośrednie działanie użytkownika, jak po naciśnięciu przycisku na stronie.
Klesun
wydaje się, że zwraca to tylko zwykły tekst ... nawet jeśli w schowku znajduje się tekst sformatowany. jak mogę to dostać? \
Michael,
@Michael, obsługa obrazów i innych została właśnie dodana w ostatniej wersji Chrome (76)
iuliu.net
Możesz przetestować w konsoli, zawijając a setTimeout, a następnie klikając z powrotem na stronę.
edbentley
To w ogóle nie działa w Firefoksie.
Robber
18

Możesz użyć

window.clipboardData.getData('Text')

aby pobrać zawartość schowka użytkownika w IE. Jednak w innej przeglądarce może być konieczne użycie Flasha, aby pobrać zawartość, ponieważ nie ma standardowego interfejsu umożliwiającego dostęp do schowka. Może możesz spróbować tej wtyczki Zero Clipboard

Ricky Jiao
źródło
1
link działa dobrze (ponownie)
stephanos
5
ZeroClipboard pozwala tylko kopiować do schowka, a nie czytać z niego.
DSimon
4

Poniżej znajdziesz wybraną zawartość, a także zaktualizujesz schowek.

Powiąż identyfikator elementu ze zdarzeniem copy, a następnie pobierz wybrany tekst. Możesz zamienić lub zmodyfikować tekst. Weź schowek i ustaw nowy tekst. Aby uzyskać dokładne formatowanie, musisz ustawić typ jako „text / hmtl”. Możesz również powiązać go z dokumentem zamiast elementu.

document.querySelector('element').bind('copy', function(event) {
  var selectedText = window.getSelection().toString(); 
  selectedText = selectedText.replace(/\u200B/g, "");

  clipboardData = event.clipboardData || window.clipboardData || event.originalEvent.clipboardData;
  clipboardData.setData('text/html', selectedText);

  event.preventDefault();
});
Sollymanul Islam
źródło
24
Witamy na tej stronie! Cieszę się, że pomagasz, odpowiadając na pytanie. Ale pamiętaj, że twoja odpowiedź tak naprawdę nie odpowiada na pytanie OP. Pytanie polega na pobieraniu treści ze schowka i wklejaniu jej gdzieś podczas otwierania strony. Ponieważ pytanie nie ma tagu jquery , odpowiedzi z jQuery powinny zawierać informację, że używana jest biblioteka (jQuery).
KarelG