隐藏左右菜单,免关注即可查看全文,支持免登录复制代码。
目前為
// ==UserScript==
// @name CSDN 增强
// @namespace http://tampermonkey.net/
// @version 0.5
// @description 隐藏左右菜单,免关注即可查看全文,支持免登录复制代码。
// @author WHXRR
// @license MIT
// @match https://blog.csdn.net/*/article/details/*
// @match https://*.blog.csdn.net/article/details/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=csdn.net
// @grant none
// ==/UserScript==
(function() {
'use strict';
function addGlobalStyle(css) {
var head, style;
head = document.getElementsByTagName('head')[0];
if (!head) { return; }
style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = css;
head.appendChild(style);
}
// 1. Inject CSS to hide side menus and expand the main content area
addGlobalStyle(`
#mainBox .blog_container_aside, #rightAside, #toolBarBox, #csdn-toolbar, .passport-login-container { display: none !important; }
#mainBox { width: 100% !important; }
.nodata .container main { width: 100% !important; }
.nodata .container { margin-right: 0 !important; }
body #mainBox { width: 100% !important; }
`);
const handleDynamicContent = () => {
// 2. Expand elements that have inline styles
const articleContent = document.querySelector("#article_content");
const hideArticleBox = document.querySelector(".hide-article-box");
if (articleContent && articleContent.style.height !== "auto") {
articleContent.style.height = "auto";
}
if (hideArticleBox && hideArticleBox.style.display !== "none") {
hideArticleBox.style.display = "none";
}
// 3. Override "Login to Copy" buttons
const copyButtons = document.querySelectorAll('div.hljs-button.signin');
copyButtons.forEach(button => {
if (button.dataset.copyListenerAdded) {
return; // Skip if listener is already attached
}
// Remove login functionality
button.removeAttribute('onclick');
button.dataset.title = '复制代码';
button.classList.remove('signin');
// Add direct copy functionality
button.addEventListener('click', (event) => {
event.stopPropagation();
const pre = button.closest('pre');
if (!pre) return;
const code = pre.querySelector('code');
if (!code) return;
navigator.clipboard.writeText(code.innerText).then(() => {
button.dataset.title = '已复制!';
setTimeout(() => {
button.dataset.title = '复制代码';
}, 2000);
}).catch(err => {
console.error('Failed to copy code: ', err);
button.dataset.title = '复制失败';
setTimeout(() => {
button.dataset.title = '复制代码';
}, 2000);
});
});
button.dataset.copyListenerAdded = 'true';
});
};
// Use MutationObserver to handle all dynamically loaded content
const observer = new MutationObserver(handleDynamicContent);
observer.observe(document.body, {
childList: true,
subtree: true
});
// Initial run to catch already present elements
handleDynamicContent();
})();