console
function createClickCallback(str, setting) {
return `(function(button){
const setting = ${JSON.stringify(setting)}
function setCopied() {
button.classList.add("copied")
button.setAttribute("data-copy-success", setting['copy-success'])
}
function resetButton() {
setTimeout(function () {
button.classList.remove("copied")
button.classList.remove("error")
}, setting['copy-timeout']);
}
function onSuccess() {
setCopied();
resetButton();
}
function onError(error) {
error && console.error(error);
button.classList.add("error")
resetButton();
}
function fallbackCopyTextToClipboard(str) {
var textArea = document.createElement('textarea');
textArea.value = str
textArea.style.top = '0';
textArea.style.left = '0';
textArea.style.position = 'fixed';
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
var successful = document.execCommand('copy');
setTimeout(function () {
if (successful) onSuccess()
else onError()
}, 1);
} catch (err) {
setTimeout(function () {
onError(err)
}, 1);
}
document.body.removeChild(textArea);
}
function copyTextToClipboard(str) {
if (navigator.clipboard) {
navigator.clipboard.writeText(str)
.then(onSuccess, function () {
fallbackCopyTextToClipboard(str);
});
} else {
fallbackCopyTextToClipboard(str);
}
}
copyTextToClipboard(${JSON.stringify(str)})
})(this)`;
}
const btn = document.querySelector("button")
const codeEL = document.querySelector("code")
btn.setAttribute("onclick", createClickCallback(codeEL.textContent, {
'copy-success': '复制成功',
'copy-timeout': 3000,
}))
<pre class="language-js"><code is:raw="" class="language-js"><span class="token comment">
<span class="token comment">
<span class="token comment">
<span class="token comment">
<span class="token comment">
<span class="token comment">
<span class="token comment">
<span class="token comment">
<span class="token comment">
<span class="token comment">
<span class="token comment">
<span class="token comment">
<span class="token comment">
<span class="token comment">
<span class="token comment">
<span class="token comment">
<span class="token function">GM_addStyle</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">
.blog_container_aside,#rightAside,.recommend-box,#treeSkill,#blogExtensionBox,#recommendNps,#toolBarBox,.comment-box-old,.insert-baidu-box,.blog-footer-bottom,.blog-footer-bottom,.comment-box,.template-box,.column-group,#csdn-toolbar,.csdn-side-toolbar,#passportbox,.passport-login-container,.hide-article-box{display:none!important;}
.article_content{height:auto!important} #content_views pre code{user-select:text !important}
</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span>
<span class="token comment">
document<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">'#mainBox'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>style<span class="token punctuation">.</span>width <span class="token operator">=</span> <span class="token string">'100%'</span>
document<span class="token punctuation">.</span><span class="token function">getElementsByTagName</span><span class="token punctuation">(</span><span class="token string">'main'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>style<span class="token punctuation">.</span>width <span class="token operator">=</span> <span class="token string">'100%'</span>
document<span class="token punctuation">.</span><span class="token function">querySelectorAll</span><span class="token punctuation">(</span><span class="token string">'*'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">el</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">(</span>el<span class="token punctuation">.</span>style<span class="token punctuation">.</span>userSelect <span class="token operator">=</span> <span class="token string">'auto'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
document
<span class="token punctuation">.</span><span class="token function">querySelectorAll</span><span class="token punctuation">(</span><span class="token string">'*'</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">el</span><span class="token punctuation">)</span> <span class="token operator">=></span>
el<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span>
<span class="token string">'copy'</span><span class="token punctuation">,</span>
<span class="token punctuation">(</span><span class="token parameter">event</span><span class="token punctuation">)</span> <span class="token operator">=></span> event<span class="token punctuation">.</span><span class="token function">stopImmediatePropagation</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token boolean">true</span>
<span class="token punctuation">)</span>
<span class="token punctuation">)</span>
document
<span class="token punctuation">.</span><span class="token function">querySelectorAll</span><span class="token punctuation">(</span><span class="token string">'*'</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">el</span><span class="token punctuation">)</span> <span class="token operator">=></span>
el<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span>
<span class="token string">'click'</span><span class="token punctuation">,</span>
<span class="token punctuation">(</span><span class="token parameter">event</span><span class="token punctuation">)</span> <span class="token operator">=></span> event<span class="token punctuation">.</span><span class="token function">stopImmediatePropagation</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token boolean">true</span>
<span class="token punctuation">)</span>
<span class="token punctuation">)</span>
document
<span class="token punctuation">.</span><span class="token function">querySelectorAll</span><span class="token punctuation">(</span><span class="token string">'*'</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">el</span><span class="token punctuation">)</span> <span class="token operator">=></span>
el<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span>
<span class="token string">'mousedown'</span><span class="token punctuation">,</span>
<span class="token punctuation">(</span><span class="token parameter">event</span><span class="token punctuation">)</span> <span class="token operator">=></span> event<span class="token punctuation">.</span><span class="token function">stopImmediatePropagation</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token boolean">true</span>
<span class="token punctuation">)</span>
<span class="token punctuation">)</span>
document
<span class="token punctuation">.</span><span class="token function">querySelectorAll</span><span class="token punctuation">(</span><span class="token string">'*'</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">el</span><span class="token punctuation">)</span> <span class="token operator">=></span>
el<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span>
<span class="token string">'mouseup'</span><span class="token punctuation">,</span>
<span class="token punctuation">(</span><span class="token parameter">event</span><span class="token punctuation">)</span> <span class="token operator">=></span> event<span class="token punctuation">.</span><span class="token function">stopImmediatePropagation</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token boolean">true</span>
<span class="token punctuation">)</span>
<span class="token punctuation">)</span></code></pre>
<button class="copy"></button>
:root {
--vp-c-text-dark-2: rgba(128, 128, 128, 1);
--vp-code-copy-code-active-text: var(--vp-c-text-dark-2);
--vp-code-copy-code-hover-bg: rgba(255, 255, 255, 0.4);
--vp-code-block-bg: #292b30;
--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E");
--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E");
}
button{
border: 0;
padding: 0;
font-family: inherit;
background-color: transparent;
background-image: none;
}
button.copy:hover{
opacity: 1;
}
button.copy.copied{
opacity: 1;
}
button.copy{
direction: ltr;
position: absolute;
top: 8px;
right: 8px;
z-index: 3;
display: block;
justify-content: center;
align-items: center;
border-radius: 4px;
width: 40px;
height: 40px;
background-color: var(--vp-code-copy-code-hover-bg);
opacity: 0;
cursor: pointer;
background-image: var(--vp-icon-copy);
background-position: 50%;
background-size: 20px;
background-repeat: no-repeat;
transition: opacity .4s;
}
button.copied{
border-radius: 0 4px 4px 0;
background-color: var(--vp-code-copy-code-hover-bg);
background-image: var(--vp-icon-copied);
}
button.copied::before{
position: relative;
left: -65px;
display: flex;
justify-content: center;
align-items: center;
border-radius: 4px 0 0 4px;
width: 64px;
height: 40px;
text-align: center;
font-size: 12px;
font-weight: 500;
color: var(--vp-code-copy-code-active-text);
background-color: var(--vp-code-copy-code-hover-bg);
white-space: nowrap;
content: attr(data-copy-success);
}