由于这个答案受到了一些关注,我将凌乱的原文完全重写,以便更容易掌握。如果您想查看预修订版本,可以在此处找到。
归结起来的问题:
我可以使用 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 container 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 container
// [6]
document.body.removeChild(container)
}
解释:
查看上面代码中的注释,了解您当前在以下过程中的位置:
- 我们创建一个容器来放入我们的 HTML 代码。
- 我们将容器设置为隐藏的样式并检测页面的活动样式表。稍后将解释原因。
- 我们将容器放入页面的 DOM 中。
- 我们删除可能存在的选择并选择我们容器的内容。
我们自己进行复制。这实际上是一个多步骤的过程:Chrome 将复制它看到的文本并应用 CSS 样式,而其他浏览器将使用浏览器的默认样式复制它。因此,我们将在复制之前禁用所有用户样式,以获得尽可能一致的结果。
- 在我们这样做之前,我们过早地执行
copy
命令。这是 IE11 的一个 hack:在这个浏览器中,复制必须手动确认一次。直到用户单击“确认”按钮,IE 用户才会看到没有任何样式的页面。为了避免这种情况,我们先复制,等待确认,然后禁用样式并再次复制。那时我们不会收到确认对话框,因为 IE 会记住我们的最后选择。
- 我们实际上禁用了页面的样式。
- 现在我们
copy
再次执行命令。
- 我们重新启用样式表。
- 我们从页面的 DOM 中移除容器。
我们已经完成了。
注意事项:
格式化的内容在浏览器之间不会完全一致。
如上所述,Chrome(即 Blink 引擎)将使用与 Firefox 和 IE 不同的策略:Chrome 将使用其 CSS 样式复制内容,但省略任何未定义的样式。
另一方面,Firefox 和 IE 不会应用特定于页面的 CSS,它们将应用浏览器的默认样式。这也意味着它们将应用一些奇怪的样式,例如默认字体(通常是Times New Roman)。
出于安全原因,浏览器将只允许该功能作为用户交互(例如点击、按键等)的效果执行。