// ==UserScript== // @name 知乎美化 // @namespace http://tampermonkey.net/ // @version 2026.11.2 // @description 1.【重要更新】增加夜间模式按钮 2.知乎题目栏增加举报、匿名、问题日志、快捷键四个按钮 3.知乎按钮图标在鼠标悬停时变色(题目按钮、回答下方按钮、评论按钮等) 4.回答的发布时间移至顶部 5.图片原图显示 6.文字和卡片链接从知乎跳转链接改为直链 7.隐藏侧边栏 8.GIF图自动播放【默认不开启】 9.问题增加创建时间和最后编辑时间 10.鼠标悬停在回答时显示浅蓝色聚焦框 11.引用角标高亮 12.首页信息流增加不感兴趣按钮 13.【重要更新】增加设置界面 14.显示信息流标签【默认不开启】 // @author AN drew // @match *://*.zhihu.com/* // @match https://v.vzuu.com/video/* // @require https://lib.baomitu.com/jquery/3.5.0/jquery.min.js // @require https://lib.baomitu.com/jquery-cookie/1.4.1/jquery.cookie.min.js // @resource zhihu-beautify https://update.greasyfork.org/scripts/523346/zhihu-beautify.user.css // @connect zhihu.com // @connect vzuu.com // @grant GM_info // @grant GM_download // @grant GM_registerMenuCommand // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @grant GM_addStyle // @grant GM_getResourceText // @grant GM_setClipboard // @run-at document-end // ==/UserScript== /* var hideIndexSidebar; //隐藏首页侧边栏 var hideQuestionSidebar; //隐藏回答侧边栏 var hideSearchSideBar; //隐藏搜索侧边栏 var hideTopicSideBar; //隐藏话题侧边栏 var hideCollectionSideBar; //隐藏收藏侧边栏 //var hideClubSideBar; //隐藏圈子侧边栏(X) //var hideDraftSideBar; //隐藏草稿侧边栏(X) //var hideLaterSideBar; //隐藏稍后答侧边栏(X) var hideRingSideBar; //隐藏圈子侧边栏 var hideProfileSidebar; //隐藏用户主页侧边栏 var hideColumnSideBar; //隐藏专栏文章侧边栏 var hideRecommendedReading; //隐藏专栏推荐阅读 var publishTop; //置顶回答时间 var GIFAutoPlay; //GIF自动播放 var hoverShadow; //悬停时显示浅蓝色边框 var blockingPictureVideo; //隐藏图片/视频 var flowTag; //显示信息流标签 var prefersColorScheme; //跟随系统夜间模式 var hideFeedSource; //隐藏动态来源 */ /* ============ hover 去重补丁 ============ * 给 .hover() 加上"先解绑再绑"。 * 用 data 记录回调(而不是命名空间),只解绑自己那一个,绝不误伤别人的监听器。 */ (function () { var jq = (typeof jQuery !== 'undefined') ? jQuery : (typeof $ !== 'undefined') ? $ : (window && window.jQuery) ? window.jQuery : (window && window.$) ? window.$ : null; if (!jq || !jq.fn || !jq.fn.hover) return; if (window.__zhHoverPatched) return; // 防重复打补丁 window.__zhHoverPatched = true; jq.fn.hover = function (enter, leave) { return this.each(function () { var $el = jq(this); var prevEnter = $el.data('zhHoverEnter'); // 上次绑到这个元素的回调 var prevLeave = $el.data('zhHoverLeave'); if (prevEnter) { $el.off('mouseenter', prevEnter); $el.off('mouseleave', prevLeave); } $el.data('zhHoverEnter', enter); $el.data('zhHoverLeave', leave); $el.on('mouseenter', enter); if (leave) { $el.on('mouseleave', leave); } }); }; })(); /* ============ style 去重补丁 ============ * 给 .attr() 设置 style / fill / src / data-theme 时加上“同值跳过”。 * style 先交给浏览器规范化再比较;只把有差异的节点交给原始 attr。 * 其他属性、getter、对象值、函数值等一律走原逻辑,不改变 jQuery 行为。 */ (function () { var jq = (typeof jQuery !== 'undefined') ? jQuery : (typeof $ !== 'undefined') ? $ : (window && window.jQuery) ? window.jQuery : (window && window.$) ? window.$ : null; if (!jq || !jq.fn || !jq.fn.attr) return; if (window.__zhAttrSkipPatched) return; // 防重复打补丁 window.__zhAttrSkipPatched = true; var SKIP_ATTRS = { style: 1, fill: 1, src: 1, 'data-theme': 1 }; var oAttr = jq.fn.attr; var probe = null; var normCache = Object.create(null); // 把一段 style 字符串规范化成浏览器解析后的形式,用于等价比较 // ("color:#175199" 与 "color: rgb(23, 81, 153);" 是同一个意思) function normStyle(value) { if (normCache[value] !== undefined) return normCache[value]; if (!probe) probe = document.createElement('div'); probe.style.cssText = ''; probe.style.cssText = value; var norm = probe.style.cssText; normCache[value] = norm; return norm; } jq.fn.attr = function (k, v) { if (arguments.length >= 2 && typeof v === 'string' && SKIP_ATTRS[k] && this.length) { var nodes = []; this.each(function () { var same = (k === 'style') ? (this.style && this.style.cssText === normStyle(v)) : (this.getAttribute(k) === v); if (!same) nodes.push(this); }); if (!nodes.length) return this; // 全都相同 → 一个字节都不写 oAttr.call(jq(nodes), k, v); return this; } return oAttr.apply(this, arguments); }; })(); // 复用同一个