您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
用鼠标选中你要复制的文本内容, 会弹出一个提示条, 点击第一个复制, 如果提示条关闭了说明复制成功
// ==UserScript== // @name CSDN辅助 // @namespace http://tampermonkey.net/ // @version 0.3.0 // @description 用鼠标选中你要复制的文本内容, 会弹出一个提示条, 点击第一个复制, 如果提示条关闭了说明复制成功 // @author HUIHONG // @match https://blog.csdn.net/** // @icon https://g.csdnimg.cn/static/logo/favicon32.ico // @grant none // @license MIT // ==/UserScript== (function () { 'use strict'; // 将代码设置为可编辑状态 for (const code of document.querySelectorAll("code")) { code.contentEditable = "true"; } // 当鼠标抬起的时候, 监听是否有元素#articleSearchTip document.addEventListener("mouseup", function (e) { // 检查是否有这个提示条, 有的话就更新这个提示条 checkArticleSearchTip(); }); // 每隔500毫秒查找一次, 一共查找5次 function checkArticleSearchTip(i) { i = i || 1; // 是否有元素#articleSearchTip const articleSearchTip = document.querySelector("#articleSearchTip"); if (articleSearchTip == null) { // 是否结束查找 if (i <= 5) { setTimeout(() => checkArticleSearchTip(i + 1), 500); } return; } // 添加一个复制选项框 updateArticleSearchTip(articleSearchTip); } // 向提示框中添加一个复制项 function updateArticleSearchTip(tip) { // 是否已经将节点插入进去了 if (tip == null || document.getElementById("newCopyNode")) { return; } // 创建节点 const copyNode = document.createElement("a"); copyNode.innerHTML = '<img src="https://csdnimg.cn/release/blogv2/dist/pc/img/newcNoteWhite.png"><span class="article-text">复制</span>'; copyNode.setAttribute("class", "article-href cnote"); copyNode.setAttribute("href", "javascript:void(0);"); copyNode.id = "newCopyNode"; // 为节点添加点击事件 copyNode.addEventListener("click", copySelectedContent); // 将节点插入到提示条中 tip.insertBefore(copyNode, tip.children[0]); } // 复制被选中的内容到剪切板 function copySelectedContent() { // 获取选中内容 const selection = window.getSelection().toString(); // 将选中内容写入到剪切板中, 成功就关闭提示框 navigator && navigator.clipboard.writeText(selection).then(function () { // 关闭提示框 document.querySelector("#articleSearchTip").remove(); // 清空选中内容 window.getSelection().empty(); }); } if (/https:\/\/blog.csdn.net\/[^\/]+\/category_[0-9_]+\.html/.test(window.location.href)) { function getScrollTop() { let scrollTop = 0 if (document.documentElement && document.documentElement.scrollTop) { scrollTop = document.documentElement.scrollTop } else if (document.body) { scrollTop = document.body.scrollTop } return scrollTop } function getClientHeight() { var clientHeight = 0 if (document.body.clientHeight && document.documentElement.clientHeight) { clientHeight = Math.min(document.body.clientHeight, document.documentElement.clientHeight) } else { clientHeight = Math.max(document.body.clientHeight, document.documentElement.clientHeight) } return clientHeight } function getScrollHeight() { return Math.max(document.body.scrollHeight, document.documentElement.scrollHeight) } function isScrollBottom() { return getScrollTop() + getClientHeight() == getScrollHeight(); } function hidden(clsList) { for (const cls of clsList) { const fixed = document.querySelector(cls); fixed && fixed.setAttribute("style", "display:none;" + fixed.getAttribute("style")); } } // 隐藏顶部固定栏 hidden([".column_info_box", ".column_person_box"]); // 滚动到底部, 加载下一页数据 window.hasNextPage = true; window.addEventListener("scroll", (e) => { // 是否滚动到底部 if (isScrollBottom() && window.hasNextPage) { // 获取下一页标签 const nextPage = window.currentPage + 1; // 获取下一页的链接地址, 并请求下一页 const nextUrl = getAllUrl(nextPage); fetch(nextUrl) .then(res => res.text()) .then(html => { // 解析html const parser = new DOMParser(); const doc = parser.parseFromString(html, 'text/html'); // 获取列表目录 const columnList = document.querySelector("ul.column_article_list"); // 扩展到当前目录 for (const column of doc.querySelectorAll("ul.column_article_list > li")) { columnList.appendChild(column); } // 更新当前页 window.currentPage = nextPage; }) .catch(e => { window.hasNextPage = false; console.log("下一页获取失败: ", e); }); } }); } // 不需要关注也能加载全文 $('btn-readmore').hasClass("no-login") || ($("div.article_content").removeAttr("style"), 0 == $(".column-mask").length && $(".hide-article-box").hide(), $('btn-readmore').hasClass("fans_read_more") && ($("#btnAttent").hasClass("attented") || $(".tool-attend").trigger("click"))) })();