#javascript #clipboard
#javascript #буфер обмена
Вопрос:
При нажатии кнопки у пользователя будет HTML-контент с текущей страницы в буфер обмена. Затем в электронное письмо вставьте содержимое с сохранением форматирования HTML. Желание состоит в том, чтобы повторить выбор содержимого в окне браузера, не заставляя пользователя выполнять выбор (отдельный просмотр).
У меня есть большая часть этой настройки и работы. Я не верю, что есть проблемы с разрешениями. Однако с помощью приведенного ниже кода я получаю «вставку», но затем вставляю (CTRL V) после этого в буфере вставки ничего нет. Если я переключу его clipboard.writeText()
, я получу html в виде открытого текста. Просто использование Blob
for html приводит к тому, что буфер вставки становится пустым.
Я думаю, что это относится к Blob
части, может text/html
быть, часть неверна? Есть ли способ заставить это работать?
<div id="lipsum" contenteditable="true" style="display: none;">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p>Vivamus mollis, augue eu vulputate fermentum.</p>
</div>
<script>
(function() {
let html = document.getElementById('lipsum').innerHTML
let content = new Blob([ html ], { type: 'text/html' })
let data = [ new ClipboardItem({ [ content.type ]: content }) ]
window.focus()
setTimeout(() => {
navigator.clipboard.write(data).then(
() => console.log('pasted'), <<< This fires
(error) => console.log('not pasted', error)
)
}, 2000)
})()
</script>
Комментарии:
1. Я могу повторить проблему,
text/html
используя прослушиватель событий и изменив тип содержимого буфера обмена наtext/html
. Должно быть, в этой причуде что-то есть.
Ответ №1:
Ваш код работал для меня в Chrome. Я смог вставить содержимое div после загрузки страницы и ожидания пару секунд. Я действительно замечал ошибки, если у меня не было постоянного фокуса на странице. Например, когда я переводил окно инспектора вперед, это приводило к ошибке.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
<div id="lipsum" contenteditable="true" style="display: none;">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p>Vivamus mollis, augue eu vulputate fermentum.</p>
</div>
<script>
(function() {
let html = document.getElementById('lipsum').innerHTML
let content = new Blob([ html ], { type: 'text/plain' })
let data = [ new ClipboardItem({ [ content.type ]: content }) ]
setTimeout(() => {
window.focus()
navigator.clipboard.write(data).then(
() => console.log('pasted'),
(error) => console.log('not pasted', error)
)
}, 2000)
})()</script>
</body>
</html>
Комментарии:
1. Да, я думаю, я только что понял, что Synergy (совместное использование клавиатуры и мыши) удаляет html.
2. Я сделал что-то подобное в прошлом, и это немного проблематично для разных браузеров / сред. Всегда есть что-то вроде clipboardjs.com
3. Да, так оно и было (копирование на другой компьютер, должно быть, привело к удалению содержимого буфера обмена, связанного с html).
4. Поздно на вечеринку, но я не совсем понимаю это решение. В исходном вопросе в качестве типа MIME был указан ‘text / html’, и проблема, похоже, связана с этим. В этом ответе тип MIME изменен на «текст / обычный». Это работает нормально (при вставке вы получаете HTML-теги дословно, вы не вставляете форматированный контент), но на самом деле это не было целью первоначального вопроса, не так ли? Я что-то пропустил?