Add copy to clipboard button to all preformat code in pure Javascript
document.onreadystatechange = function () { if (document.readyState == "complete") { // for all pre > code document.querySelectorAll("pre > code").forEach(function (codeBlock) { // create anchor element let copy = document.createElement("a"); copy.className = "btn-copy"; copy.innerText = "Copy"; copy.title = "Copy to Clipboard!"; copy.href = "#";
// add click event copy.addEventListener( "click", function (e) { copy.innerText = "Copied!";
// copy innerText of preformat navigator.clipboard.writeText(codeBlock.innerText).then( function () { setTimeout(function () { copy.innerText = "Copy"; }, 500); }, function (err) { copy.innerText = "ERROR"; }, );
// do nothing else... e.preventDefault(); e.stopPropagation(); }, false, );
// insert before codeBlock <pre><a><code> codeBlock.parentNode.insertBefore(copy, codeBlock); }); }};
a.btn-copy,a.btn-copy:hover { color: black; user-select: none; position: absolute; padding: 8px; font-size: smaller; right: 0; top: 0;}
As with many new APIs, navigator.clipboard
is only supported for pages served over HTTPS. To help prevent abuse, clipboard access is only allowed when a page is the active tab. Pages in active tabs can write to the clipboard without requesting permission, but reading from the clipboard always requires permission.
https://developers.google.com/web/updates/2018/03/clipboardapi