Отримати поточний вміст буфера обміну? [зачинено]


107

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


Ви не можете насправді знати, що знаходиться в буфері обміну користувачем, якщо не скористалися якимось флеш-серверним процесом, коли вони копіювали текст. ------- Оновлення: Тут є більш правильна відповідь
Нафталі, він же Ніл,



Відповіді:


73

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


17
Чи буде це працювати в будь-якому іншому браузері, крім Internet Explorer?
Андерсон Грін,

6
Можливо, ні. Переглянути це запитання: stackoverflow.com/questions/400212/…
Дейв,

7
Перевірити сумісність можна тут caniuse.com/#search=clipboardData
Сергій Новіков

1
Краще рішення - отримати за допомогою вузла, але не за допомогою вікна. Дивіться тут
rplaurindo

Мене турбує Keepass та його безпека. Додаток дозволяє копіювати свої паролі в буфер обміну.
Рене Вінклер

69

Використовуйте новий API буфера обміну через navigator.clipboard. Його можна використовувати так:

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

Або з асинхронним синтаксисом:

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

Майте на увазі, що це запропонує користувачеві діалогове вікно із запитом дозволу, тож жодна смішна справа неможлива.

Наведений вище код не буде працювати, якщо його викликати з консолі. Це працює лише тоді, коли ви запускаєте код на активній вкладці. Для запуску коду з вашої консолі ви можете встановити час очікування та швидко натиснути у вікні веб-сайту:

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

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

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


18
Зверніть увагу, що це завжди призводить до помилки при виклику з консолі. Але це робить роботу на прямому дію користувача, як при натисканні кнопки на сторінці.
Клесун,

здається, це повертає лише звичайний текст ... навіть коли в буфер обміну є розширений текст. як я можу це отримати? \
Майкл

@Michael, підтримка зображень та інших нещодавно додано в останній версії Chrome (76)
iuliu.net

Ви можете протестувати в консолі, загорнувши в setTimeout, а потім клацнувши назад на сторінці.
edbentley

18

Можна використовувати

window.clipboardData.getData('Text')

отримати вміст буфера обміну користувача в IE. Однак в іншому браузері вам може знадобитися використовувати flash для отримання вмісту, оскільки немає стандартного інтерфейсу для доступу до буфера обміну. Можливо, ви можете спробувати цей плагін 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();
});

21
Ласкаво просимо на цей сайт! Я радий, що ви сприяєте, відповідаючи на питання. Але, будь ласка, майте на увазі, що ваша відповідь насправді не відповідає на запитання ОП. Питання полягає в отриманні вмісту з буфера обміну та вставці його кудись при відкритті сторінки. Крім того, оскільки запитання не має тегу jquery , відповіді з jQuery повинні містити примітку про те, що використовується бібліотека (jQuery).
KarelG
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.