664571221
发表于 2025-8-31 09:43:02
看不懂啊e大这个是干嘛的
senry
发表于 2025-8-31 17:48:14
本帖最后由 senry 于 2025-8-31 17:50 编辑
我让Gemini给按钮增加一个样式:lol
// ==UserScript==
// @name 明经复制代码扩展 (优化版)
// @namespace http://tampermonkey.net/
// @version 2025-08-31
// @description为明经论坛的代码区添加一个美观且功能更强大的复制按钮。
// @author edata (优化 by Gemini)
// @match *://*.mjtd.com/*
// @icon http://bbs.mjtd.com/favicon.ico
// @grant GM_addStyle
// @grant GM_setClipboard
// ==/UserScript==
(function() {
'use strict';
// 使用油猴的 @grant 命令添加CSS样式,让按钮更美观
GM_addStyle(`
.copy-btn {
margin-left: 15px; /* 与标题保持一些距离 */
padding: 2px 8px; /* 增加内边距,让按钮看起来更大 */
color: #1e90ff; /* 设置漂亮的蓝色字体 */
font-weight: bold; /* 字体加粗 */
cursor: pointer; /* 鼠标悬停时显示小手图标 */
border: 1px solid #1e90ff; /* 添加一个边框 */
border-radius: 4px; /* 圆角 */
user-select: none; /* 防止双击时选中文本 */
transition: all 0.2s; /* 添加过渡动画效果 */
}
.copy-btn:hover {
background-color: #1e90ff; /* 鼠标悬停时改变背景色 */
color: white; /* 鼠标悬停时改变文字颜色 */
}
.copy-btn:active {
transform: scale(0.95); /* 鼠标点击时有轻微的缩小效果 */
}
.copy-btn.copied {
background-color: #28a745; /* 复制成功后的绿色 */
color: white;
border-color: #28a745;
}
`);
// 转换HTML转义字符为正常字符
// 这个函数基本正确,但可以扩展以处理更多转义字符
function unescapeHTML(str) {
if (!str) return "";
// 使用一个div元素来解码,这是最安全和全面的方法
const tempDiv = document.createElement('div');
tempDiv.innerHTML = str;
return tempDiv.textContent || tempDiv.innerText || "";
}
// 主处理函数
function addCopyButtons() {
// 【优化#1】使用 querySelectorAll 获取所有代码块,更健壮
// 选择所有ID以 "mc_code" 开头的元素
const codeBlocks = document.querySelectorAll('');
codeBlocks.forEach(block => {
const titleElement = block.querySelector('.jssccodetitle');
if (!titleElement) return;
// 检查是否已添加按钮,防止重复添加
if (titleElement.querySelector('.copy-btn')) return;
// 创建复制按钮
const copyBtn = document.createElement('span');
copyBtn.className = 'copy-btn';
copyBtn.textContent = '复制代码'; // "复制代码" 可能比 "格式复制" 更直观
// 添加点击事件
copyBtn.addEventListener('click', () => {
const textarea = block.querySelector('textarea');
if (!textarea) return;
// 【优化#2】使用 .value 获取 textarea 的内容,更规范
let textToCopy = textarea.value;
// 论坛的<textarea>里可能还有转义的HTML,先解码
textToCopy = unescapeHTML(textToCopy);
// 明经论坛的代码块里有很多不必要的 <br />,这里可以直接替换为换行符
textToCopy = textToCopy.replace(/<br\s*\/?>/gi, '\n');
// 检查页面是否存在原生的 setCopy 函数
if (typeof setCopy === 'function') {
// 【优化#3】直接调用原生函数,可以利用网站自带的提示
setCopy(textToCopy, "代码已复制到剪贴板");
} else {
// 如果原生函数不存在,使用油猴提供的API作为备用,更可靠
GM_setClipboard(textToCopy);
}
// 提供视觉反馈
copyBtn.textContent = '复制成功!';
copyBtn.classList.add('copied');
setTimeout(() => {
copyBtn.textContent = '复制代码';
copyBtn.classList.remove('copied');
}, 2000); // 2秒后恢复原状
});
// 将按钮插入到标题栏
titleElement.appendChild(copyBtn);
});
}
// 【优化#4】使用 MutationObserver 监听DOM变化,以处理动态加载的内容
const observer = new MutationObserver((mutations) => {
// 简单地重新运行函数,它会跳过已经添加按钮的元素
addCopyButtons();
});
// 配置观察器:观察子节点的变化
const config = { childList: true, subtree: true };
// 启动观察器,监视整个文档的body
observer.observe(document.body, config);
// 页面首次加载时先立即运行一次
addCopyButtons();
})();
行天下
发表于 2025-9-12 15:43:39
简直了,立国利民
masterlong
发表于 前天 16:09
我一般是点“普通浏览”
ctrl+A再接ctrl+C
edata
发表于 前天 17:08
masterlong 发表于 2025-9-25 16:09
我一般是点“普通浏览”
ctrl+A再接ctrl+C
使用环境win10+edge浏览器,普通浏览复制出来的有非法的空白字符.