#javascript #google-chrome #dom-events
Вопрос:
У меня есть функция, которая вызывается при двойном щелчке обработчика событий. Я вызываю нижеприведенную функцию при событии dblclick, передающем целевой текст в виде текстовой копии paremeter.
copyToClipboard = function (texttocopy) {
'use strict';
var answer = confirm(`Do you want to copy into the clipbaord `);
if (answer == true) {
let input = document.createElement('textarea');
input.innerHTML = texttocopy;
document.body.appendChild(input);
input.select();
let result = document.execCommand('copy', false);
document.body.removeChild(input);
if (result) return;
else alert("Failed to copy to clipboard");
}
}
Если я нажму кнопку Ок во всплывающем окне подтверждения, скажем, через 2 секунды, мой код будет выполнен успешно, но если я нажму через 5-10 секунд, он не сработает. Насколько я понимаю, document.exeCommand работает с короткоживущими обработчиками событий, созданными пользователем. Но я хочу понять, что на самом деле считается «кратковременным событием»,
Есть ли способ, которым я могу сделать это успешным программно.
Ответ №1:
Как вы уже упоминали:
Эти команды можно использовать без каких-либо специальных разрешений, если вы используете их в обработчике кратковременных событий для действия пользователя (например, обработчик щелчка). (источник)
Проблема, с которой вы сталкиваетесь, заключается в том, что вы используете confirm
. Это диалоговое окно нарушает нормальный поток (оно останавливает работу), что выводит вас из области действия этого обработчика событий.
Удаление этого confirm
должно решить вашу проблему:
copyToClipboard = function (texttocopy) {
'use strict';
var answer = true; //confirm(`Do you want to copy into the clipbaord `);
if (answer == true) {
let input = document.createElement('textarea');
input.innerHTML = texttocopy;
document.body.appendChild(input);
input.select();
let result = document.execCommand('copy', false);
document.body.removeChild(input);
if (result) return;
else alert("Failed to copy to clipboard");
}
}
document.getElementById('copy')
.addEventListener('click', () => copyToClipboard(
'Copy this text to the clipboard!'));
<button type="button" id="copy">Click me!</button>
Комментарии:
1. Но он все еще работает для подтверждения, нажатого через 1-2 секунды, поэтому я не согласен с тем, что он выходит за рамки eventhandler. Мой вопрос в том, что определяет кратковременное событие.
2. Я бы предположил, что это зависит от браузера. Эти события всегда запускаются в результате взаимодействия с пользователем , и они недолговечны по соображениям безопасности, так как эти события сопровождаются некоторыми дополнительными разрешениями, такими как копирование и вставка. Это
confirm
очень упрощает для вашего кода истечение срока действия события, возможно, «область действия» здесь не совсем подходящее слово. Если вам нужно диалоговое окно подтверждения, вам придется создать диалоговое окно, которое запускает действие копирования, когда пользователь нажимает кнопку «ок» в вашем пользовательском диалоговом окне.3. Есть ли способ проверить исходный код document.execCommand. Дело не в том, что я не хочу использовать пользовательское диалоговое окно, но я хотел бы знать, что это за свойство события, которое делает его недолговечным. Я считаю, что свойство isTrusted события является одним из факторов, который должен проверять этот api, и мне интересно, какое еще поле это может быть
4. FireFox и Chromium (движок chrome) имеют открытый исходный код, так что вы могли бы изучить это. Я подозреваю, что у события есть какой-то таймер / отметка времени, но это то, что вы не можете подделать без изменения браузера.
5. Да, я согласен, я не собираюсь притворяться, но хотел бы знать, что именно является кратковременным событием. Запускают ли они таймер, и если да, то как долго и т.д. Я проверил код chromium с открытым исходным кодом, и мне было больно искать там точную функцию. Я ищу не в том направлении