Получить текущее содержимое буфера обмена? [закрыто]

112

Я хотел бы знать, как заставить мой сценарий обнаруживать содержимое буфера обмена и вставлять его в текстовое поле при открытии страницы без ввода данных пользователем. Как это сделать?

Габриэле Чирулли
источник
Вы не можете точно знать, что находится в буфере обмена пользователя, если только вы не использовали какой-то флеш-сервер при копировании текста. ------- Обновление: более правильный ответ здесь
Нафтали, он же Нил,
1
возможный дубликат Можно ли читать буфер обмена в Firefox, Safari и Chrome с помощью Javascript?
оплачиваемый ботаник

Ответы:

74

window.clipboardData.getData('Text')будет работать в некоторых браузерах. Однако во многих браузерах, где это действительно работает, пользователю будет предложено указать, желает ли он, чтобы веб-страница имела доступ к буферу обмена.

Дэйв
источник
18
Будет ли это работать в любом браузере, кроме Internet Explorer?
Андерсон Грин
6
Возможно нет. См. Этот вопрос: stackoverflow.com/questions/400212/…
Дэйв,
7
Вы можете проверить совместимость здесь caniuse.com/#search=clipboardData
Сергей Новиков
1
Лучшее решение - получить объект узла, но не объект окна. Смотрите здесь
rplaurindo
Меня беспокоит Keepass и его безопасность. Приложение позволяет копировать пароли в буфер обмена.
Рене Винклер,
74

Используйте новый API буфера обмена через navigator.clipboard. Его можно использовать так:

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

Или с синтаксисом async:

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

Имейте в виду, что это предложит пользователю диалоговое окно запроса разрешения, так что никакой забавный бизнес невозможен.

Приведенный выше код не будет работать, если его вызвать с консоли. Это работает только при запуске кода на активной вкладке. Чтобы запустить код с консоли, вы можете установить тайм-аут и быстро щелкнуть в окне веб-сайта:

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

Подробнее об API и использовании читайте в документации для разработчиков Google .

Спецификация

iuliu.net
источник
18
Обратите внимание, что при вызове с консоли всегда возникает ошибка. Но это делает работу на прямом действие пользователя, как при нажатии кнопки на странице.
Клесун
кажется, это возвращает только простой текст ... даже если в буфере обмена находится форматированный текст. как я могу это получить? \
Майкл
@Michael, поддержка изображений и прочего была добавлена ​​в последней версии Chrome (76)
iuliu.net
Вы можете протестировать в консоли, заключив в a setTimeout, а затем вернувшись на страницу.
edbentley
Это вообще не работает в Firefox.
Грабитель
18

Ты можешь использовать

window.clipboardData.getData('Text')

чтобы получить содержимое буфера обмена пользователя в IE. Однако в другом браузере вам может потребоваться использовать флеш-память для получения контента, поскольку нет стандартного интерфейса для доступа к буферу обмена. Может быть, вы можете попробовать этот плагин Zero Clipboard

Рики Цзяо
источник
1
ссылка работает нормально (снова)
stephanos
5
ZeroClipboard позволяет копировать только в буфер обмена, но не читать из него.
DSimon
4

Далее вы получите выбранный контент, а также обновите буфер обмена.

Свяжите идентификатор элемента с событием копирования, а затем получите выделенный текст. Вы можете заменить или изменить текст. Получите буфер обмена и установите новый текст. Чтобы получить точное форматирование, вам нужно установить тип как «text / hmtl». Вы также можете привязать его к документу вместо элемента.

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();
});
Соллиманул Ислам
источник
24
Добро пожаловать на этот сайт! Я рад, что вы вносите свой вклад, отвечая на вопрос. Но имейте в виду, что ваш ответ на самом деле не отвечает на вопрос OP. Вопрос в том, чтобы получить содержимое из буфера обмена и вставить его куда-нибудь при открытии страницы. Кроме того, поскольку в вопросе нет тега jquery , ответы с jQuery должны содержать примечание об использовании библиотеки (jQuery).
KarelG