Поскольку этот ответ получил некоторое внимание, я полностью переписал грязный оригинал, чтобы его было легче понять. Если вы хотите посмотреть предварительную версию, вы можете найти ее here.
Вареное вниз вопрос:
Могу ли я использовать JavaScript, чтобы скопировать форматированный вывод некоторых HTML-код в буфер обмена пользователей?
Ответ:
Да, с некоторыми ограничениями, вы можете.
Решение:
Ниже функция, которая будет делать именно это. Я тестировал его с помощью необходимых браузеров, он работает во всех них. IE 11 будет запрашивать подтверждение этого действия.
Объяснение, как это работает, можно найти ниже, вы можете в интерактивном режиме проверить функцию в этом jsFiddle.
// This function expects an HTML string and copies it as rich text.
function copyFormatted (html) {
// Create container for the HTML
// [1]
var container = document.createElement('div')
container.innerHTML = html
// Hide element
// [2]
container.style.position = 'fixed'
container.style.pointerEvents = 'none'
container.style.opacity = 0
// Detect all style sheets of the page
var activeSheets = Array.prototype.slice.call(document.styleSheets)
.filter(function (sheet) {
return !sheet.disabled
})
// Mount the iframe to the DOM to make `contentWindow` available
// [3]
document.body.appendChild(container)
// Copy to clipboard
// [4]
window.getSelection().removeAllRanges()
var range = document.createRange()
range.selectNode(container)
window.getSelection().addRange(range)
// [5.1]
document.execCommand('copy')
// [5.2]
for (var i = 0; i < activeSheets.length; i++) activeSheets[i].disabled = true
// [5.3]
document.execCommand('copy')
// [5.4]
for (var i = 0; i < activeSheets.length; i++) activeSheets[i].disabled = false
// Remove the iframe
// [6]
document.body.removeChild(container)
}
Объяснение:
Посмотрите на комментарии в коде выше, чтобы увидеть, где вы в настоящее время находятся в следующем процессе:
- Мы создаем контейнер поставить наш HTML-код в.
- Мы создаем контейнер для скрытия и обнаруживаем активные таблицы стилей страницы. Причина будет объяснена в ближайшее время.
- Мы помещаем контейнер в DOM страницы.
- Мы удаляем, возможно, существующие выборы и выбираем содержимое нашего контейнера.
Мы делаем само копирование.На самом деле это многоступенчатый процесс: Chrome будет копировать текст, когда он его видит, с применением стилей CSS, в то время как другие браузеры будут копировать его со стилями по умолчанию в браузере. Поэтому мы будем отключать все пользовательские стили перед копированием, чтобы получить максимально согласованный результат.
- Прежде чем мы это сделаем, мы преждевременно выполним команду
copy
. Это взломать IE11: в этом браузере копирование должно быть подтверждено вручную один раз. Пока пользователь не нажмет кнопку «Подтвердить», пользователи IE будут видеть страницу без каких-либо стилей. Чтобы этого избежать, мы сначала копируем, дождитесь подтверждения, затем отключим стили и снова скопируем. В тот раз мы не получим диалог подтверждения, так как IE помнит наш последний выбор.
- Мы фактически отключили стили страницы.
- Теперь мы снова выполним команду
copy
.
- Мы снова включаем таблицы стилей.
- Мы удаляем контейнер из DOM страницы.
И все готово.
Предостережения:
Отформатированная содержание не будет полностью соответствовать во всех браузерах.
Как объяснялось выше, Chrome (т. Е. Движок Blink) будет использовать другую стратегию, чем Firefox и IE: Chrome скопирует содержимое с помощью стилей CSS, но не укажет никаких стилей, которые не определены.
С другой стороны, Firefox и IE не будут применять CSS для конкретных страниц, они будут применять стили по умолчанию для браузера. Это также означает, что у них будут какие-то странные стили, применяемые к ним, например. шрифт по умолчанию (обычно это Times New Roman).
По соображениям безопасности, браузеры позволяют только функции для выполнения как эффект взаимодействия с пользователем (например, щелчок, нажатие клавиши и т.д.)
Возможный дубликат [javascript copy r ich текстовое содержимое в буфер обмена] (http://stackoverflow.com/questions/23934656/javascript-copy-rich-text-contents-to-clipboard) –
Вы уверены, что он спрашивает, как скопировать раздел HTML как богатый текст, который, я думаю, является тем, что вы ищете. Ответы оставляют желать лучшего. –
Ответ от другого вопроса, который может помочь: http://stackoverflow.com/a/31945909/3155639 –