В настоящее время я копирую текст в буфер обмена, используя следующий код:
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);
Вы не можете манипулировать содержимым буфера обмена без прямого взаимодействия с пользователем.
Пожалуйста, укажите код setTimeout, который не работает.
@HarryCutts Я добавил код, который пытаюсь выполнить внутри setTimeout.
@Carcigenicate Да, я пытаюсь заставить его работать с Firefox. То, что я ищу, - это обходной путь, поэтому он работает с Firefox. Для моего веб-приложения мне нужно очистить скопированный текст из буфера обмена через 1 минуту.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Firefox требует, чтобы команда исходила из пользовательского события, такого как щелчок. Вот почему это не работает из обработчика. (Вы бы не хотели, чтобы какой-то мошеннический javascript вставлял туда данные, верно?)
Точная формулировка: команда должна вызываться из
a short running user-generated event handler
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>Хакерский обходной путь - использовать Flash: https://brooknovak.wordpress.com/2009/07/28/accessing-the-system-clipboard-with-javascript/
Существуют также методы удержания контекста клика из пользовательского события, а затем его использования для запуска другого события клика из вашего обработчика, который, в свою очередь, вызывает ваш код.
Я не уверен, что обновление браузера очистит буфер обмена, но если это так, вы можете сохранить свое состояние, возможно, в локальном хранилище, а затем принудительно обновить.
Я действительно предпочел бы не использовать Flash. Не могли бы вы подробнее рассказать о втором методе удержания контекста клика и его использовании позже?
@PratanuMandal Я добавил еще один обходной путь и добавлю ссылку на рассматриваемый.
@PratanuMandal Я кое-что нашел. Прочитайте мой первый обходной путь. Это «почти ясно», потому что в буфере обмена есть место.
Код, который вы предоставили, у меня не работает. На самом деле, я уже пробовал это, и это тоже не сработало раньше. Не могли бы вы проверить?
Вы обслуживаете свою страницу https?
Да, я обслуживаю свою страницу как https
Вы используете Firefox? Возможный обман stackoverflow.com/questions/41094318/…