Javascript очистить буфер обмена через 1 минуту

В настоящее время я копирую текст в буфер обмена, используя следующий код:

navigator.clipboard.writeText(element.value).then(function() {
    /* clipboard successfully set */
}, function() {
    /* clipboard write failed */
    console.info('Copy to clipboard failed!');
});

Мне нужно автоматически очистить буфер обмена через 1 минуту, если данные успешно скопированы в буфер обмена.

Я пытался использовать метод setTimeout(), но запись в буфер обмена не удалась при вызове из setTimeout.

Кроме того, если я использую метод execCommand('copy'), я получаю сообщение об ошибке: document.execCommand(‘cut’/‘copy’) was denied because it was not called from inside a short running user-generated event handler.

Я пытаюсь заставить его работать в Firefox.

Код, который я пытаюсь поместить внутрь setTimeout(), выглядит следующим образом:

setTimeout(function() {
    navigator.clipboard.writeText('').then(function() {
        /* Successfully cleared clipboard */
    }, function() {
        /* Failed to clear clipboard */
    }
}, 60000);

Вы используете Firefox? Возможный обман stackoverflow.com/questions/41094318/…

Carcigenicate 02.03.2019 00:48

Вы не можете манипулировать содержимым буфера обмена без прямого взаимодействия с пользователем.

Teemu 02.03.2019 00:52

Пожалуйста, укажите код setTimeout, который не работает.

Harry Cutts 02.03.2019 00:53

@HarryCutts Я добавил код, который пытаюсь выполнить внутри setTimeout.

Pratanu Mandal 02.03.2019 15:04

@Carcigenicate Да, я пытаюсь заставить его работать с Firefox. То, что я ищу, - это обходной путь, поэтому он работает с Firefox. Для моего веб-приложения мне нужно очистить скопированный текст из буфера обмена через 1 минуту.

Pratanu Mandal 02.03.2019 15:06
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
3 310
1

Ответы 1

Firefox требует, чтобы команда исходила из пользовательского события, такого как щелчок. Вот почему это не работает из обработчика. (Вы бы не хотели, чтобы какой-то мошеннический javascript вставлял туда данные, верно?)

Точная формулировка: команда должна вызываться из

a short running user-generated event handler

Обходные пути

1 манекен input element и document.execCommand("copy")

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

function clearClipboardFromSetTimeout() {
  // This should work but does not
  //if (document.selection) document.selection.empty()
  //else window.getSelection().removeAllRanges()

  // Create a dummy input to select
  var tempElement = document.createElement("input");
  tempElement.style.cssText = "width:0!important;padding:0!important;border:0!important;margin:0!important;outline:none!important;boxShadow:none!important;";
  document.body.appendChild(tempElement);
  tempElement.value = ' ' // Empty string won't work!
  tempElement.select();
  document.execCommand("copy");
  document.body.removeChild(tempElement)
}

function doIt() {
  navigator.clipboard
    .writeText("hello")
    .then(_ =>
      navigator.clipboard.readText().then(text => console.info("before", text))
    );

  setTimeout(() => {
    clearClipboardFromSetTimeout()
    navigator.clipboard.readText().then(text => console.info("after", text));
  }, 2000);
}
<div>This will Snippet will not work in Firefox, but the <em>clearClipboardFromSetTimeout</em> method will.</div>

<button onclick='doIt()'>Set Then Clear In setTimeOut</button>

2 вспышки

Хакерский обходной путь - использовать Flash: https://brooknovak.wordpress.com/2009/07/28/accessing-the-system-clipboard-with-javascript/

3 Обман обработчика кликов

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

4 Обновление браузера

Я не уверен, что обновление браузера очистит буфер обмена, но если это так, вы можете сохранить свое состояние, возможно, в локальном хранилище, а затем принудительно обновить.

Я действительно предпочел бы не использовать Flash. Не могли бы вы подробнее рассказать о втором методе удержания контекста клика и его использовании позже?

Pratanu Mandal 02.03.2019 15:24

@PratanuMandal Я добавил еще один обходной путь и добавлю ссылку на рассматриваемый.

Steven Spungin 02.03.2019 15:27

@PratanuMandal Я кое-что нашел. Прочитайте мой первый обходной путь. Это «почти ясно», потому что в буфере обмена есть место.

Steven Spungin 02.03.2019 16:20

Код, который вы предоставили, у меня не работает. На самом деле, я уже пробовал это, и это тоже не сработало раньше. Не могли бы вы проверить?

Pratanu Mandal 02.03.2019 21:15

Вы обслуживаете свою страницу https?

Steven Spungin 02.03.2019 21:50

Да, я обслуживаю свою страницу как https

Pratanu Mandal 02.03.2019 23:12

Другие вопросы по теме