Этот вопрос связан с другим вопросом, который я задал , но я понял, что побочный вопрос в этом вопросе заслуживает своего собственного вопроса.
Используя JavaScript, я хотел бы посмотреть, что пользователи копируют с веб-страницы. Чтение содержимого буфера обмена довольно просто, когда пользователь вставляет :
document.addEventListener("paste", e => {
let text = e.clipboardData.getData("text");
alert("pasting text: " + text);
});
Это правильно создает предупреждение с тем, что только что было вставлено. Однако получить данные из буфера обмена сложнее, когда пользователь копирует .
Метод 1 (не работает)
document.addEventListener("copy", e => {
let text = e.clipboardData.getData("text");
alert("copying text: " + text);
});
Это предупреждает о «копировании данных», но без текста после него. Это потому, что метод getData
возвращает ""
(пустая строка). Насколько я понимаю, для сайтов будет считаться слишком большой проблемой безопасности читать ваш буфер обмена, когда вы делаете что-то кроме вставки.
Способ 2 (работает, но с всплывающим окном)
document.addEventListener("copy", () => {
navigator.clipboard.readText().then(text => alert("copied text: " + text));
});
Это работает, но перед предупреждением создает всплывающее окно с запросом разрешения для сайта на чтение буфера обмена. Я бы предпочел не иметь этого всплывающего окна.
Метод 3 (кажется, работает, но не кажется правильным)
document.addEventListener("copy", () => {
let text = window.getSelection().toString();
alert("copying text: " + text);
});
Это похоже на то, что я хочу. Кажется странным, что это будет разрешено, но метод 1 - нет.
У меня есть пара вопросов:
- Почему метод 1 не разрешен, если метод 3 разрешен? Похоже, что метод 1 может предоставить ту же информацию, что и метод 3, и он будет более удобным и безопасным.
- Есть ли случаи, когда метод 3 давал бы результаты, отличные от метода 2 (с точки зрения переменной
text
, а не поведения всплывающего окна)?
- Существуют ли другие недостатки использования метода 3, которые я не рассматриваю?
На данный момент меня интересуют эти ответы только в контексте Google Chrome или Chromium, а не в других браузерах. Будем благодарны за ответы на любые из этих вопросов.