From 49f1ec9c299cc0f4facf6b8005d020bd66f55aa4 Mon Sep 17 00:00:00 2001 From: xiu2 <54703944+XIU2@users.noreply.github.com> Date: Thu, 25 Nov 2021 18:08:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E7=82=B9=E5=87=BB=E5=90=8E=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E5=88=B0=E7=99=BB=E5=BD=95=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Zhihu-Enhanced.user.js | 1504 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 1501 insertions(+), 3 deletions(-) diff --git a/Zhihu-Enhanced.user.js b/Zhihu-Enhanced.user.js index 1fcb151..257bb12 100644 --- a/Zhihu-Enhanced.user.js +++ b/Zhihu-Enhanced.user.js @@ -1,6 +1,6 @@ // ==UserScript== // @name 知乎增强 -// @version 1.8.0 +// @version 1.8.1 // @author X.I.U // @description 移除登录弹窗、屏蔽首页视频、默认收起回答、快捷收起当前回答/评论(左键两侧空白处)、快捷回到顶部(右键两侧空白处)、屏蔽用户 (发布的内容)、屏蔽关键词(标题/评论)、屏蔽盐选内容、净化标题消息、展开问题描述、置顶显示时间、完整问题时间、区分问题文章、直达问题按钮、默认高清原图、默认站外直链 // @match *://www.zhihu.com/* @@ -1073,8 +1073,1506 @@ function removeLogin() { if (document.querySelector('button.AppHeader-login')) { // 未登录 const observer = new MutationObserver(removeLoginModal); observer.observe(document, { childList: true, subtree: true }); - document.lastElementChild.appendChild(document.createElement('style')).textContent = '.Question-mainColumnLogin {display: none !important;}'; // 屏蔽问题页中间的登录提示 - document.querySelector('button.AppHeader-login').onclick=function(){location.href='https://www.zhihu.com/signin';} // [登录] 按钮跳转至登录页面 + document.lastElementChild.appendChild(document.createElement('style')).textContent = '.Question-mainColumnLogin, button.AppHeader-login {display: none !important;}'; // 屏蔽问题页中间的登录提示 + document.querySelector('button.AppHeader-login').insertAdjacentHTML('afterend', '登录'); // [登录] 按钮跳转至登录页面 + } else { + cleanTitles(); // 净化标题消息 + } + } +} + + +// 净化标题消息 +function cleanTitles() { + if (!menu_value('menu_cleanTitles')) return + + // 方案一 + const elTitle = document.head.querySelector('title'); + const original = elTitle.textContent; + const observer = new MutationObserver(function() { + if (elTitle.textContent != original) { // 避免重复执行 + elTitle.textContent = original; + } + }); + observer.observe(elTitle, { childList: true }); + + // 方案二 + // if (Reflect.getOwnPropertyDescriptor(document, 'title')) { + // const elTitle = document.head.querySelector('title'); + // const original = elTitle.textContent; + // const observer = new MutationObserver(function() { + // if (elTitle.textContent != original) { // 避免重复执行 + // elTitle.textContent = original; + // } + // }); + // observer.observe(elTitle, { childList: true }); + // } else { + // const title = document.title; + // Reflect.defineProperty(document, 'title', { + // set: () => {}, + // get: () => title, + // }); + // } +} + + +// 快捷关闭悬浮评论(监听点击事件,点击网页两侧空白处) +function closeFloatingComments() { + const closeFloatingCommentsModal = (mutationsList, observer) => { + for (const mutation of mutationsList) { + for (const target of mutation.addedNodes) { + if (target.nodeType != 1) return + if (target.querySelector('.Modal-backdrop')) { + document.querySelector('.Modal-backdrop').onclick = function(event){ + if (event.target == this) { + let button = document.querySelector('.Button.Modal-closeButton.Button--plain'); + if (button) button.click(); + } + } + } + } + } + }; + const observer = new MutationObserver(closeFloatingCommentsModal); + observer.observe(document, { childList: true, subtree: true }); +} + + +// 监听 XMLHttpRequest 事件 +/*function EventXMLHttpRequest() { + var _send = window.XMLHttpRequest.prototype.send + function sendReplacement(data) { + addTypeTips(); + return _send.apply(this, arguments); + } + window.XMLHttpRequest.prototype.send = sendReplacement; +}*/ + + +// 自定义 locationchange 事件(用来监听 URL 变化) +function addLocationchange() { + history.pushState = ( f => function pushState(){ + var ret = f.apply(this, arguments); + window.dispatchEvent(new Event('pushstate')); + window.dispatchEvent(new Event('locationchange')); + return ret; + })(history.pushState); + + history.replaceState = ( f => function replaceState(){ + var ret = f.apply(this, arguments); + window.dispatchEvent(new Event('replacestate')); + window.dispatchEvent(new Event('locationchange')); + return ret; + })(history.replaceState); + + window.addEventListener('popstate',()=>{ + window.dispatchEvent(new Event('locationchange')) + }); +} + + +// [完整显示时间 + 置顶显示时间] 功能修改自:https://greasyfork.org/scripts/402808(从 JQuery 改为原生 JavaScript,且优化了代码) +// 完整显示时间 + 置顶显示时间 - 首页 +function topTime_index() { + let topTime = document.querySelectorAll('.TopstoryItem');if (!topTime) return + topTime.forEach(function(_this) { + let ContentItemTime = _this.querySelector('.ContentItem-time');if (!ContentItemTime) return + if (!(ContentItemTime.classList.contains('full')) && ContentItemTime.querySelector('span') && ContentItemTime.querySelector('span').innerText != null) { + // 完整显示时间 + topTime_allTime(ContentItemTime) + // 发布时间置顶 + topTime_publishTop(ContentItemTime, _this, 'ContentItem-meta') + } + }); +} + + +// 完整显示时间 + 置顶显示时间 - 回答页 +function topTime_question() { + let topTime = document.querySelectorAll('.ContentItem.AnswerItem');if (!topTime) return + topTime.forEach(function(_this) { + let ContentItemTime = _this.querySelector('.ContentItem-time');if (!ContentItemTime) return + if (!(ContentItemTime.classList.contains('full')) && ContentItemTime.querySelector('span') && ContentItemTime.querySelector('span').innerText != null) { + // 完整显示时间 + topTime_allTime(ContentItemTime) + // 发布时间置顶 + topTime_publishTop(ContentItemTime, _this, 'ContentItem-meta') + } + + }); + + // 问题创建时间 + if (!(document.querySelector('.QuestionPage .QuestionHeader-side p')) && location.href.indexOf("log") == -1) { // 没有执行过 且 非问题日志页 + let createtime = document.querySelector('.QuestionPage>[itemprop~=dateCreated]').getAttribute('content'); + let modifiedtime = document.querySelector('.QuestionPage>[itemprop~=dateModified]').getAttribute('content'); + createtime = getUTC8(new Date(createtime)); + modifiedtime = getUTC8(new Date(modifiedtime)); + // 添加到问题页右上角 + document.querySelector('.QuestionPage .QuestionHeader-side').insertAdjacentHTML('beforeEnd', '

创建时间:  ' + createtime + '

最后编辑:  ' + modifiedtime + '

'); + } +} + + +// 完整显示时间 + 置顶显示时间 - 搜索结果页 +function topTime_search() { + let topTime = document.querySelectorAll('.ContentItem.AnswerItem, .ContentItem.ArticleItem');if (!topTime) return + topTime.forEach(function(_this) { + let ContentItemTime = _this.querySelector('.ContentItem-time');if (!ContentItemTime) return + if (!(ContentItemTime.classList.contains('full')) && ContentItemTime.querySelector('span') && ContentItemTime.querySelector('span').innerText != null) { + // 完整显示时间 + topTime_allTime(ContentItemTime) + // 发布时间置顶 + topTime_publishTop(ContentItemTime, _this, 'SearchItem-meta') + } + + }); +} + + +// 完整显示时间 + 置顶显示时间 - 用户主页 +function topTime_people() { + let topTime = document.querySelectorAll('.ContentItem.AnswerItem, .ContentItem.ArticleItem');if (!topTime) return + topTime.forEach(function(_this) { + let ContentItemTime = _this.querySelector('.ContentItem-time');if (!ContentItemTime) return + if (!(ContentItemTime.classList.contains('full')) && ContentItemTime.querySelector('span') && ContentItemTime.querySelector('span').innerText != null) { + // 完整显示时间 + topTime_allTime(ContentItemTime) + // 发布时间置顶 + topTime_publishTop(ContentItemTime, _this, 'ContentItem-meta') + } + + }); +} + + +// 完整显示时间 + 置顶显示时间 - 专栏/文章 +function topTime_zhuanlan() { + let ContentItemTime = document.querySelector('.ContentItem-time');if (!ContentItemTime) return + // 完整显示时间 + if (menu_value('menu_allTime')) { + if (ContentItemTime.innerText.indexOf('编辑于') > -1 && !(ContentItemTime.classList.contains('doneeeeee'))) { + let bianjiyu = ContentItemTime.innerText; + ContentItemTime.click(); + ContentItemTime.innerText = (ContentItemTime.innerText + "," + bianjiyu) + ContentItemTime.classList.add("doneeeeee"); + } + } + + //发布时间置顶 + if (menu_value('menu_publishTop') && !(document.querySelector('.Post-Header > .ContentItem-time')) && !(document.querySelector('.ContentItem-meta > .ContentItem-time'))) { + ContentItemTime.style.cssText = 'padding:0px 0px 0px 0px; margin-top: 14px' + let temp_time = ContentItemTime.cloneNode(true); + // ContentItemTime.style.display = 'none'; + if (location.href.indexOf("column") > -1){ + document.querySelector('.ContentItem-meta').insertAdjacentElement('beforeEnd', temp_time); + } else { + document.querySelector('.Post-Header').insertAdjacentElement('beforeEnd', temp_time); + } + } +} + + +// 完整显示时间 +function topTime_allTime(ContentItemTime) { + if (!menu_value('menu_allTime')) return + if (ContentItemTime.innerText.indexOf("发布于") == -1 && ContentItemTime.innerText.indexOf("编辑于") > -1) { //只有 "编辑于" 时增加具体发布时间 data-tooltip + let data_tooltip = ContentItemTime.querySelector('span').getAttribute('data-tooltip'); + let oldtext = ContentItemTime.querySelector('span').innerText; + ContentItemTime.querySelector('span').innerText = data_tooltip + "," + oldtext; + ContentItemTime.classList.add('full'); + } else if (ContentItemTime.innerText.indexOf("发布于") > -1 && ContentItemTime.innerText.indexOf("编辑于") == -1) { //只有 "发布于" 时替换为具体发布时间 data-tooltip + let data_tooltip = ContentItemTime.querySelector('span').getAttribute('data-tooltip'); + ContentItemTime.querySelector('span').innerText = data_tooltip; + ContentItemTime.classList.add('full'); + } +} + + +// 发布时间置顶 +function topTime_publishTop(ContentItemTime, _this, class_) { + if (!menu_value('menu_publishTop')) return + if (!ContentItemTime.parentNode.classList.contains(class_)) { + let temp_time = ContentItemTime.cloneNode(true); + //_this.querySelector('.RichContent .ContentItem-time').style.display = 'none'; + _this.querySelector('.' + class_).insertAdjacentElement('beforeEnd', temp_time); + } +} + + +// UTC 标准时转 UTC+8 北京时间,来自:https://greasyfork.org/zh-CN/scripts/402808 +function getUTC8(datetime) { + let month = (datetime.getMonth() + 1) < 10 ? "0" + (datetime.getMonth() + 1) : (datetime.getMonth() + 1); + let date = datetime.getDate() < 10 ? "0" + datetime.getDate() : datetime.getDate(); + let hours = datetime.getHours() < 10 ? "0" + datetime.getHours() : datetime.getHours(); + let minutes = datetime.getMinutes() < 10 ? "0" + datetime.getMinutes() : datetime.getMinutes(); + let seconds = datetime.getSeconds() < 10 ? "0" + datetime.getSeconds() : datetime.getSeconds(); + return (datetime.getFullYear() + "-" + month + "-" + date + "\xa0\xa0" + hours + ":" + minutes + ":" + seconds); +} + + +// 默认站外直链,修改自:https://greasyfork.org/scripts/402808(从 JQuery 改为原生 JavaScript) +function directLink () { + let link, equal, colon, externalHref, protocol, path, newHref; + // 文字链接 + link = document.querySelectorAll('a[class*="external"]') + if (link) { + link.forEach(function (_this) { + if (_this.getElementsByTagName('span').length > 0) { + newHref = _this.innerText; + _this.setAttribute('href', newHref); + } else if (_this.href.indexOf("link.zhihu.com/?target=") > -1) { + externalHref = _this.href; + newHref = externalHref.substring(externalHref = _this.href.indexOf('link.zhihu.com/?target=') + 'link.zhihu.com/?target='.length); + _this.setAttribute('href', decodeURIComponent(newHref)); + } else { + externalHref = _this.href; + if (externalHref.lastIndexOf("https%3A")) { + newHref = _this.href.substring(_this.href.lastIndexOf("https%3A")); + } else if (externalHref.lastIndexOf("http%3A%2F%2F")) { + newHref = _this.href.substring(_this.href.lastIndexOf("http%3A")); + } + _this.setAttribute('href', decodeURIComponent(newHref)); + } + }); + } + + // 卡片链接 + link = document.querySelectorAll('a[class*="LinkCard"]:not([class*="MCNLinkCard"]):not([class*="ZVideoLinkCard"])') + if (link) { + link.forEach(function (_this) { + if (_this.getElementsByTagName('LinkCard-title').length > 0 && _this.getElementsByTagName('LinkCard-title')[0].indexOf("http") > -1) { + newHref = _this.getElementsByTagName('LinkCard-title').innerText; + _this.setAttribute('href', newHref); + } else if (_this.href.indexOf("link.zhihu.com/?target=") > -1) { + externalHref = _this.href; + newHref = externalHref.substring(externalHref = _this.href.indexOf("link.zhihu.com/?target=") + "link.zhihu.com/?target=".length); + _this.setAttribute('href', decodeURIComponent(newHref)); + } else { + externalHref = _this.href; + if (externalHref.lastIndexOf("https%3A")) { + newHref = _this.href.substring(_this.href.lastIndexOf("https%3A")); + } else if (externalHref.lastIndexOf("http%3A%2F%2F")) { + newHref = _this.href.substring(_this.href.lastIndexOf("http%3A")); + } + _this.setAttribute('href', decodeURIComponent(newHref)); + } + }); + } + + // 旧版视频卡片链接 + link = document.querySelectorAll('a.VideoCard-link') + if (link) { + link.forEach(function (_this) { + if (_this.href.indexOf('link.zhihu.com/?target=') > -1) { + externalHref = _this.href; + equal = externalHref.lastIndexOf('http'); + colon = externalHref.lastIndexOf('%3A'); + protocol = externalHref.substring(equal, colon); + path = externalHref.substring(colon + 5, externalHref.length); + newHref = protocol + '://' + path; + _this.setAttribute('href', decodeURIComponent(newHref)); + } + }); + } +} + + +// 默认高清原图,修改自:https://greasyfork.org/scripts/402808(从 JQuery 改为原生 JavaScript) +function originalPic(){ + let pic = document.getElementsByTagName('img');if (!pic) return + Array.from(pic).forEach(function(pic1){ + if (pic1.getAttribute('data-original') != undefined && pic1.className != 'comment_sticker') { + if (pic1.getAttribute('src') != pic1.getAttribute('data-original')) { + pic1.setAttribute('src', pic1.getAttribute('data-original')) + } + } + }); +} + + +// 默认折叠邀请,修改自:https://greasyfork.org/scripts/402808(从 JQuery 改为原生 JavaScript) +function questionInvitation(){ + let timer = setInterval(function(){ + let QuestionInvitation = document.querySelector('.QuestionInvitation-content');if (!QuestionInvitation) return + clearInterval(timer); + QuestionInvitation.style.display = 'none'; + document.querySelector('.QuestionInvitation-title').innerHTML = document.querySelector('.QuestionInvitation-title').innerText + ' 展开/折叠' + // 点击事件(展开/折叠) + document.querySelector('.Topbar').onclick = function(){ + let QuestionInvitation = document.querySelector('.QuestionInvitation-content') + if (QuestionInvitation.style.display == 'none') { + QuestionInvitation.style.display = '' + } else { + QuestionInvitation.style.display = 'none' + } + } + }); +} + + +(function() { + addLocationchange(); + removeLogin(); // 移除登录弹窗 + setInterval(originalPic,100); // 默认高清原图 + if (menu_value('menu_directLink')) setInterval(directLink, 100); // 默认站外直链 + window.addEventListener('locationchange', function(){ // 针对的是从单个回答页跳转到完整回答页时 + if (location.pathname.indexOf('question') > -1 && location.pathname.indexOf('waiting') === -1 && location.pathname.indexOf('/answer/') === -1) { // 回答页 // + setTimeout(function(){ + collapsedNowAnswer('.QuestionPage'); // 收起当前回答 + 快捷返回顶部 + collapsedNowAnswer('.Question-main'); // 收起当前回答 + 快捷返回顶部 + questionRichTextMore(); // 展开问题描述 + blockUsers('question'); // 屏蔽指定用户 + blockYanXuan(); // 屏蔽盐选内容 + }, 300); + } + }) + + if (GM_info.scriptHandler === 'Violentmonkey') { // Violentmonkey 比 Tampermonkey 加载更早,会导致一些元素还没加载,因此需要延迟一会儿 + setTimeout(start, 300); + } else { + start(); + } + + function start(){ + if (location.hostname != 'zhuanlan.zhihu.com') collapsedAnswer(); // 一键收起回答 + if (location.hostname != 'zhuanlan.zhihu.com') questionInvitation(); //默认折叠邀请 + closeFloatingComments(); // 快捷关闭悬浮评论(监听点击事件,点击网页两侧空白处) + blockKeywords('comment'); // 屏蔽指定关键词(评论) + if (location.pathname.indexOf('question') > -1) { // 回答页 // + if (location.pathname.indexOf('waiting') == -1) { + collapsedNowAnswer('.QuestionPage'); // 收起当前回答 + 快捷返回顶部 + collapsedNowAnswer('.Question-main'); // 收起当前回答 + 快捷返回顶部 + questionRichTextMore(); // 展开问题描述 + blockUsers('question'); // 屏蔽指定用户 + blockYanXuan(); // 屏蔽盐选内容 + defaultCollapsedAnswer(); // 默认收起回答 + } + setInterval(topTime_question, 300); // 置顶显示时间 + } else if (location.pathname === '/search') { // 搜索结果页 // + collapsedNowAnswer('main div'); // 收起当前回答 + 快捷返回顶部 + collapsedNowAnswer('.Search-container'); // 收起当前回答 + 快捷返回顶部 + setInterval(topTime_search, 300); // 置顶显示时间 + addTypeTips(); // 区分问题文章 + addToQuestion(); // 直达问题按钮 + blockUsers('search'); // 屏蔽指定用户 + blockKeywords('search'); // 屏蔽指定关键词 + blockType('search'); // 屏蔽指定类别(视频/文章等) + } else if (location.pathname.indexOf('/topic/') > -1) { // 话题页 // + if (location.pathname.indexOf('/hot') > -1 || location.href.indexOf('/top-answers') > -1) { // 仅限 [讨论] [精华] + collapsedNowAnswer('main.App-main'); // 收起当前回答 + 快捷返回顶部 + collapsedNowAnswer('.ContentLayout'); // 收起当前回答 + 快捷返回顶部 + setInterval(topTime_people, 300); // 置顶显示时间 + addTypeTips(); // 区分问题文章 + addToQuestion(); // 直达问题按钮 + blockUsers('topic'); // 屏蔽指定用户 + blockKeywords('topic'); // 屏蔽指定关键词 + } + } else if (location.hostname === 'zhuanlan.zhihu.com'){ // 文章 // + backToTop('article.Post-Main.Post-NormalMain'); // 快捷返回顶部 + backToTop('div.Post-Sub.Post-NormalSub'); // 快捷返回顶部 + setInterval(topTime_zhuanlan, 300); // 置顶显示时间 + blockUsers(); // 屏蔽指定用户 + } else if (location.pathname.indexOf('/column/') > -1) { // 专栏 // + collapsedNowAnswer('main div'); // 收起当前回答 + 快捷返回顶部 + setInterval(topTime_zhuanlan, 300); // 置顶显示时间 + blockUsers(); // 屏蔽指定用户 + } else if (location.pathname.indexOf('/people/') > -1 || location.href.indexOf('org') > -1) { // 用户主页 // + if (location.pathname.split('/').length === 3) addTypeTips();addToQuestion(); // 区分问题文章、直达问题按钮 + collapsedNowAnswer('main div'); // 收起当前回答 + 快捷返回顶部 + collapsedNowAnswer('.Profile-main'); // 收起当前回答 + 快捷返回顶部 + setInterval(topTime_people, 300); // 置顶显示时间 + blockUsers('people'); // 屏蔽指定用户 + blockKeywords('people'); // 屏蔽指定关键词 + } else { // 首页 // + collapsedNowAnswer('main div'); // 收起当前回答 + 快捷返回顶部 + collapsedNowAnswer('.Topstory-container'); // 收起当前回答 + 快捷返回顶部 + setInterval(topTime_index, 300); // 置顶显示时间 + addTypeTips(); // 区分问题文章 + addToQuestion(); // 直达问题按钮 + blockUsers('index'); // 屏蔽指定用户 + blockKeywords('index'); // 屏蔽指定关键词 + blockType(); // 屏蔽指定类别(视频/文章等) + // 解决屏蔽视频后,因为首页信息流太少而没有滚动条导致无法加载更多内容的问题 + if (menu_value('menu_blockTypeVideo')) document.lastElementChild.appendChild(document.createElement('style')).textContent = '.Topstory-container{min-height: 1500px;}'; + } + } +})();// ==UserScript== +// @name 知乎增强 +// @version 1.8.1 +// @author X.I.U +// @description 移除登录弹窗、屏蔽首页视频、默认收起回答、快捷收起当前回答/评论(左键两侧空白处)、快捷回到顶部(右键两侧空白处)、屏蔽用户 (发布的内容)、屏蔽关键词(标题/评论)、屏蔽盐选内容、净化标题消息、展开问题描述、置顶显示时间、完整问题时间、区分问题文章、直达问题按钮、默认高清原图、默认站外直链 +// @match *://www.zhihu.com/* +// @match *://zhuanlan.zhihu.com/* +// @icon https://static.zhihu.com/heifetz/favicon.ico +// @grant GM_xmlhttpRequest +// @grant GM_registerMenuCommand +// @grant GM_unregisterMenuCommand +// @grant GM_openInTab +// @grant GM_getValue +// @grant GM_setValue +// @grant GM_notification +// @grant GM_info +// @license GPL-3.0 License +// @run-at document-end +// @incompatible safari +// @namespace https://greasyfork.org/scripts/4122051 +// @supportURL https://github.com/XIU2/UserScript +// @homepageURL https://github.com/XIU2/UserScript +// ==/UserScript== + +'use strict'; +var menu_ALL = [ + ['menu_defaultCollapsedAnswer', '默认收起回答', '默认收起回答', true], + ['menu_collapsedAnswer', '一键收起回答', '一键收起回答', true], + ['menu_collapsedNowAnswer', '收起当前回答/评论 (点击两侧空白处)', '收起当前回答/评论', true], + ['menu_backToTop', '快捷回到顶部 (右键两侧空白处)', '快捷回到顶部', true], + ['menu_blockUsers', '屏蔽指定用户', '屏蔽指定用户', true], + ['menu_customBlockUsers', '自定义屏蔽用户', '自定义屏蔽用户', ['故事档案局', '盐选推荐', '盐选科普', '盐选成长计划', '知乎盐选会员', '知乎盐选创作者', '盐选心理', '盐选健康必修课', '盐选奇妙物语', '盐选生活馆', '盐选职场', '盐选文学甄选', '盐选作者小管家', '盐选博物馆', '盐选点金', '盐选测评室', '盐选科技前沿', '盐选会员精品']], + ['menu_blockKeywords', '屏蔽指定关键词', '屏蔽指定关键词', true], + ['menu_customBlockKeywords', '自定义屏蔽关键词', '自定义屏蔽关键词', []], + ['menu_blockType', '屏蔽指定类别 (视频/文章等)', '勾选 = 屏蔽该类别的信息流', ''], + ['menu_blockTypeVideo', '视频 [首页、搜索页]', '视频(首页、搜索页)', true], + ['menu_blockTypeArticle', '文章 [首页、搜索页]', '文章(首页、搜索页)', false], + ['menu_blockTypeTopic', '话题 [搜索页]', '话题(搜索页)', false], + ['menu_blockTypeSearch', '杂志文章、相关搜索等 [搜索页]', '相关搜索、杂志等(搜索页)', false], + ['menu_blockYanXuan', '屏蔽盐选内容', '屏蔽盐选内容', false], + ['menu_cleanTitles', '净化标题消息 (标题中的私信/消息)', '净化标题提醒', false], + ['menu_questionRichTextMore', '展开问题描述', '展开问题描述', false], + ['menu_publishTop', '置顶显示时间', '置顶显示时间', true], + ['menu_allTime', '完整显示时间', '完整显示时间', true], + ['menu_typeTips', '区分问题文章', '区分问题文章', true], + ['menu_toQuestion', '直达问题按钮', '直达问题按钮', true], + ['menu_directLink', '默认站外直链', '默认站外直链', true] +], menu_ID = []; +for (let i=0;i menu_ALL.length){ // 如果菜单ID数组多于菜单数组,说明不是首次添加菜单,需要卸载所有脚本菜单 + for (let i=0;i.zhihuE_SettingRoot {position: absolute;top: 50%;left: 50%;-webkit-transform: translate(-50%, -50%);-moz-transform: translate(-50%, -50%);-ms-transform: translate(-50%, -50%);-o-transform: translate(-50%, -50%);transform: translate(-50%, -50%);width: auto;min-width: 400px;max-width: 600px;height: auto;min-height: 150px;max-height: 400px;color: #535353;background-color: #fff;border-radius: 3px;} +.zhihuE_SettingBackdrop_1 {position: fixed;top: 0;right: 0;bottom: 0;left: 0;z-index: 203;display: -webkit-box;display: -ms-flexbox;display: flex;-webkit-box-orient: vertical;-webkit-box-direction: normal;-ms-flex-direction: column;flex-direction: column;-webkit-box-pack: center;-ms-flex-pack: center;justify-content: center;overflow-x: hidden;overflow-y: auto;-webkit-transition: opacity .3s ease-out;transition: opacity .3s ease-out;} +.zhihuE_SettingBackdrop_2 {position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 0;background-color: rgba(18,18,18,.65);-webkit-transition: background-color .3s ease-out;transition: background-color .3s ease-out;} +.zhihuE_SettingRoot .zhihuE_SettingHeader {padding: 10px 20px;color: #fff;font-weight: bold;background-color: #3994ff;border-radius: 3px 3px 0 0;} +.zhihuE_SettingRoot .zhihuE_SettingMain {padding: 10px 20px;border-radius: 0 0 3px 3px;} +.zhihuE_SettingHeader span {float: right;cursor: pointer;} +.zhihuE_SettingMain input {margin: 10px 6px 10px 0;cursor: pointer;vertical-align:middle} +.zhihuE_SettingMain label {margin-right: 20px;user-select: none;cursor: pointer;vertical-align:middle} +.zhihuE_SettingMain hr {border: 0.5px solid #f4f4f4;} +[data-theme="dark"] .zhihuE_SettingRoot {color: #adbac7;background-color: #343A44;} +[data-theme="dark"] .zhihuE_SettingHeader {color: #d0d0d0;background-color: #2D333B;} +[data-theme="dark"] .zhihuE_SettingMain hr {border: 0.5px solid #2d333b;} +
+
${title}
+

${tips}


` + if (line) _br = '
' + for (let i=0; i${menu[i][1]}${_br}` + } else { + _html += `${_br}` + } + } + _html += `
` + document.body.insertAdjacentHTML('beforeend', _html); // 插入网页末尾 + setTimeout(function() { // 延迟 100 毫秒,避免太快 + // 关闭按钮 点击事件 + document.querySelector('.zhihuE_SettingClose').onclick = function(){this.parentElement.parentElement.parentElement.remove();document.querySelector('.zhihuE_SettingStyle').remove();} + // 点击周围空白处 = 点击关闭按钮 + document.querySelector('.zhihuE_SettingBackdrop_2').onclick = function(event){if (event.target == this) {document.querySelector('.zhihuE_SettingClose').click();};} + // 复选框 点击事件 + document.getElementsByName('zhihuE_Setting').forEach(function (checkBox) { + checkBox.addEventListener('click', function(){if (this.checked) {GM_setValue(this.value, true);} else {GM_setValue(this.value, false);}}); + }) + }, 100) +} + + +// 添加收起回答观察器 +function getCollapsedAnswerObserver() { + if (!window._collapsedAnswerObserver) { + const observer = new MutationObserver(mutations => { + for (const mutation of mutations) { + if (mutation.target.hasAttribute('script-collapsed')) return + if (!mutation.target.classList.contains('RichContent')) continue + for (const addedNode of mutation.addedNodes) { + if (addedNode.nodeType != Node.ELEMENT_NODE) continue + const button = addedNode.querySelector('.ContentItem-actions.Sticky [data-zop-retract-question]'); + if (button) { + mutation.target.setAttribute('script-collapsed', ''); + button.click(); + return + } + } + } + }) + + observer.start = function() { + if (!this._active) { + this.observe(document, { childList: true, subtree: true }); + this._active = true; + } + } + observer.end = function() { + if (this._active) { + this.disconnect(); + } + } + + window.addEventListener('locationchange', function() { + observer[location.href.indexOf('/answer/') === -1 ? 'start' : 'end'](); + }) + window._collapsedAnswerObserver = observer; + } + return window._collapsedAnswerObserver +} + + +// 默认收起回答 +function defaultCollapsedAnswer() { + if (!menu_value('menu_defaultCollapsedAnswer')) return + const observer = getCollapsedAnswerObserver(); + if (location.href.indexOf('/answer/') === -1) { + observer.start(); + } +} + + +// 一键收起回答(全部) +function collapsedAnswer() { + if (!menu_value('menu_collapsedAnswer')) return + if (document.querySelector('.CornerAnimayedFlex')) { + document.head.appendChild(document.createElement('style')).textContent = '.CornerButton{margin-bottom:8px !important;}.CornerButtons{bottom:45px !important;}'; + document.querySelector('.CornerAnimayedFlex').insertAdjacentHTML('afterBegin', ''); + document.getElementById('collapsed-button').onclick = function () { + if (location.pathname === '/' || location.pathname === '/hot' || location.pathname === '/follow') { + document.querySelectorAll('.ContentItem-rightButton').forEach(function (el) { + if (el.hasAttribute('data-zop-retract-question')) { + el.click() + } + }); + } else { + document.querySelectorAll('[script-collapsed]').forEach(function(scriptCollapsed) { + scriptCollapsed.querySelectorAll('.ContentItem-actions [data-zop-retract-question], .ContentItem-actions.Sticky [data-zop-retract-question]').forEach(function(button) { + button.click(); + }) + }) + document.querySelectorAll('.RichContent:not([script-collapsed]) .ContentItem-actions.Sticky [data-zop-retract-question]').forEach(function(button) { + let el = button.parentElement; + while (!el.classList.contains('RichContent')) { + el = el.parentElement; + } + if (el) { + el.setAttribute('script-collapsed', ''); + } + button.click(); + }) + const observer = getCollapsedAnswerObserver(); + observer.start(); + if (!menu_value('menu_defaultCollapsedAnswer') && !observer._disconnectListener) { + window.addEventListener('locationchange', function() { + observer.end(); + window._collapsedAnswerObserver = null; + }) + observer._disconnectListener = true; + } + } + } + } +} + + +// 收起当前回答、评论(监听点击事件,点击网页两侧空白处) +function collapsedNowAnswer(selectors) { + backToTop(selectors) // 快捷回到顶部 + if (!menu_value('menu_collapsedNowAnswer')) return + document.querySelector(selectors).onclick = function(event){ + if (event.target == this) { + // 下面这段主要是 [收起回答],顺便 [收起评论](如果展开了的话) + let rightButton = document.querySelector('.ContentItem-actions.Sticky.RichContent-actions.is-fixed.is-bottom') + // 悬浮在底部的 [收起回答](此时正在浏览回答内容 [中间区域]) + if (rightButton) { + // 固定的 [收起评论](先看看是否展开评论) + let commentCollapseButton = rightButton.querySelector('button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel:first-of-type') + if (commentCollapseButton && commentCollapseButton.textContent.indexOf('收起评论') > -1) commentCollapseButton.click(); + // 再去收起回答 + rightButton = rightButton.querySelector('.ContentItem-rightButton[data-zop-retract-question]') + if (rightButton) rightButton.click(); + // 固定在回答底部的 [收起回答](此时正在浏览回答内容 [尾部区域]) + } else { + let answerCollapseButton_ = false; + for (let el of document.querySelectorAll('.ContentItem-rightButton[data-zop-retract-question]')) { // 遍历所有回答底部的 [收起] 按钮 + if (isElementInViewport(el)) { // 判断该 [收起] 按钮是否在可视区域内 + // 固定的 [收起评论](先看看是否展开评论,即存在 [收起评论] 按钮) + let commentCollapseButton = el.parentNode.querySelector('button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel:first-of-type') + // 如果展开了评论,就收起评论 + if (commentCollapseButton && commentCollapseButton.textContent.indexOf('收起评论') > -1) commentCollapseButton.click(); + el.click() // 再去收起回答 + answerCollapseButton_ = true; // 如果找到并点击收起了,就没必要执行下面的代码了(可视区域中没有 [收起回答] 时) + break + } + } + // 针对完全看不到 [收起回答] 按钮时(如 [头部区域],以及部分明明很长却不显示悬浮横条的回答) + if (!answerCollapseButton_) { + for (let el of document.querySelectorAll('.List-item, .Card.AnswerCard')) { // 遍历所有回答主体元素 + if (isElementInViewport_(el)) { // 判断该回答是否在可视区域内 + // 固定的 [收起评论](先看看是否展开评论,即存在 [收起评论] 按钮) + let commentCollapseButton = el.parentNode.querySelector('button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel:first-of-type') + // 如果展开了评论,就收起评论 + if (commentCollapseButton && commentCollapseButton.textContent.indexOf('收起评论') > -1) commentCollapseButton.click(); + let answerCollapseButton__ = document.querySelector('.ContentItem-rightButton[data-zop-retract-question]'); + if (answerCollapseButton__) answerCollapseButton__.click() // 再去收起回答 + break + } + } + } + } + + // 下面这段只针对 [收起评论](如果展开了的话) + let commentCollapseButton_ = false, commentCollapseButton__ = false; + // 悬浮的 [收起评论](此时正在浏览评论内容 [中间区域]) + let commentCollapseButton = document.querySelector('.CommentCollapseButton') + if (commentCollapseButton) { + commentCollapseButton.click(); + } else { // 固定的 [收起评论](此时正在浏览评论内容 [头部区域]) + let commentCollapseButton_1 = document.querySelectorAll('.ContentItem-actions > button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel:first-of-type, .ContentItem-action > button.Button.Button--plain.Button--withIcon.Button--withLabel:first-of-type') + if (commentCollapseButton_1.length > 0) { + for (let el of commentCollapseButton_1) { + if (el.textContent.indexOf('收起评论') > -1) { + if (isElementInViewport(el)) { + el.click() + commentCollapseButton_ = true // 如果找到并点击了,就没必要执行下面的代码了(可视区域中没有 [收起评论] 时) + break + } + } + } + } + if (commentCollapseButton_ == false) { // 可视区域中没有 [收起评论] 时(此时正在浏览评论内容 [头部区域] + [尾部区域](不上不下的,既看不到固定的 [收起评论] 又看不到悬浮的 [收起评论])),需要判断可视区域中是否存在评论元素 + let commentCollapseButton_1 = document.querySelectorAll('.NestComment') + if (commentCollapseButton_1.length > 0) { + for (let el of commentCollapseButton_1) { + if (isElementInViewport(el)) { + let commentCollapseButton = findParentElement(el, 'ContentItem AnswerItem').querySelector('.ContentItem-actions > button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel:first-of-type') + if (commentCollapseButton.textContent.indexOf('收起评论') > -1) { + commentCollapseButton.click() + commentCollapseButton__ = true // 如果找到并点击了,就没必要执行下面的代码了(可视区域中没有 评论元素 时) + break + } + } + } + } + if (commentCollapseButton__ == false) { // 如果上面的都没找到,那么就尝试寻找评论末尾的 [评论回复框] + let commentCollapseButton_2 = document.querySelectorAll('.CommentsV2-footer.CommentEditorV2--normal .CommentEditorV2-inputWrap') + if (commentCollapseButton_2.length > 0) { + for (let el of commentCollapseButton_2) { + if (isElementInViewport(el)) { + let commentCollapseButton = findParentElement(el, 'ContentItem AnswerItem').querySelector('.ContentItem-actions > button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel:first-of-type') + //console.log(commentCollapseButton) + if (commentCollapseButton.textContent.indexOf('收起评论') > -1) { + commentCollapseButton.click() + break + } + } + } + } + } + } + } + } + } +} + + +// 回到顶部(监听点击事件,鼠标右键点击网页两侧空白处) +function backToTop(selectors) { + if (!menu_value('menu_backToTop')) return + document.querySelector(selectors).oncontextmenu = function(event){ + if (event.target == this) { + event.preventDefault(); + window.scrollTo(0,0) + } + } +} + + +//获取元素是否在可视区域(完全可见) +function isElementInViewport(el) { + let rect = el.getBoundingClientRect(); + return ( + rect.top >= 0 && + rect.left >= 0 && + rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && + rect.right <= (window.innerWidth || document.documentElement.clientWidth) + ); +} +//获取元素是否在可视区域(部分可见) +function isElementInViewport_(el) { + let rect = el.getBoundingClientRect(); + return ( + rect.top <= (window.innerHeight || document.documentElement.clientHeight) && + rect.left <= (window.innerWidth || document.documentElement.clientWidth) + ); +} + + +// 自定义屏蔽用户 +function customBlockUsers() { + let nowBlockUsers = ''; + menu_value('menu_customBlockUsers').forEach(function(item){nowBlockUsers += '|' + item}) + let newBlockUsers = prompt('编辑 [自定义屏蔽用户]\n(不同用户名之间使用 "|" 分隔,例如:用户A|用户B|用户C )', nowBlockUsers.replace('|','')); + if (newBlockUsers === '') { + GM_setValue('menu_customBlockUsers', []); + registerMenuCommand(); // 重新注册脚本菜单 + } else if (newBlockUsers != null) { + GM_setValue('menu_customBlockUsers', newBlockUsers.split('|')); + registerMenuCommand(); // 重新注册脚本菜单 + } +}; + + +// 屏蔽指定用户 +function blockUsers(type) { + if (!menu_value('menu_blockUsers')) return + if (!menu_value('menu_customBlockUsers') || menu_value('menu_customBlockUsers').length < 1) return + switch(type) { + case 'index': + blockUsers_('.Card.TopstoryItem.TopstoryItem--old.TopstoryItem-isRecommend', 'Card TopstoryItem TopstoryItem--old TopstoryItem-isRecommend'); + break; + case 'question': + blockUsers_question(); + break; + case 'search': + blockUsers_search(); + break; + case 'topic': + blockUsers_('.List-item.TopicFeedItem', 'List-item TopicFeedItem'); + break; + case 'people': + blockUsers_button_people(); // 添加屏蔽用户按钮(用户主页) + break; + } + blockUsers_comment(); // 评论区 + blockUsers_button(); // 加入黑名单按钮 + + function blockUsers_(className1, className2) { + // 前几条因为是直接加载的,而不是动态插入网页的,所以需要单独判断 + function blockKeywords_now() { + document.querySelectorAll(className1).forEach(function(item1){ + let item = item1.querySelector('.ContentItem.AnswerItem, .ContentItem.ArticleItem'); // 用户名所在元素 + if (item) { + for (const keyword of menu_value('menu_customBlockUsers')) { // 遍历用户名黑名单 + if (item.dataset.zop.indexOf('authorName":"' + keyword + '",') > -1) { // 找到就删除该信息流 + console.log(item.dataset.zop); + item1.hidden = true; + break; + } + } + } + }) + } + + blockKeywords_now(); + window.addEventListener('locationchange', function(){ + setTimeout(blockKeywords_now, 500); // 网页 URL 变化后再次执行 + }) + + // 这个是监听网页插入事件,用来判断后续网页动态插入的元素 + const callback = (mutationsList, observer) => { + for (const mutation of mutationsList) { + for (const target of mutation.addedNodes) { + if (target.nodeType != 1) return + if (target.className === className2) { + let item = target.querySelector('.ContentItem.AnswerItem, .ContentItem.ArticleItem'); // 用户名所在元素 + if (item) { + for (const keyword of menu_value('menu_customBlockUsers')) { // 遍历用户名黑名单 + if (item.dataset.zop.indexOf('authorName":"' + keyword + '",') > -1) { // 找到就删除该信息流 + console.log(item.dataset.zop); + target.hidden = true; + break; + } + } + } + } + } + } + }; + const observer = new MutationObserver(callback); + observer.observe(document, { childList: true, subtree: true }); + } + + + function blockUsers_question() { + const blockUsers_question_ = (mutationsList, observer) => { + for (const mutation of mutationsList) { + for (const target of mutation.addedNodes) { + if (target.nodeType != 1) return + if (target.className === 'List-item' || target.className === 'Card AnswerCard') { + let item1 = target.querySelector('.ContentItem.AnswerItem'); + if (item1) { + menu_value('menu_customBlockUsers').forEach(function(item2){ // 遍历用户黑名单 + if (item1.dataset.zop.indexOf('authorName":"' + item2 + '",') > -1) { // 找到就删除该回答 + console.log(item1.dataset.zop) + target.hidden = true; + } + }) + } + } + } + } + }; + + const blockUsers_question_answer_ = (mutationsList, observer) => { + for (const mutation of mutationsList) { + for (const target of mutation.addedNodes) { + if (target.nodeType != 1) return + target.querySelectorAll('.List-item, .Card.AnswerCard').forEach(function(item){ + let item1 = item.querySelector('.ContentItem.AnswerItem'); + if (item1) { + menu_value('menu_customBlockUsers').forEach(function(item2){ // 遍历用户黑名单 + if (item1.dataset.zop.indexOf('authorName":"' + item2 + '",') > -1) { // 找到就删除该回答 + console.log(item1.dataset.zop) + item.hidden = true; + } + }) + } + }) + } + } + }; + + if (location.pathname.indexOf('/answer/') > -1) { // 回答页(就是只有三个回答的页面) + const observer = new MutationObserver(blockUsers_question_answer_); + observer.observe(document, { childList: true, subtree: true }); + } else { // 问题页(可以显示所有回答的页面) + const observer = new MutationObserver(blockUsers_question_); + observer.observe(document, { childList: true, subtree: true }); + } + + // 针对的是打开网页后直接加载的前面几个回答(上面哪些是针对动态加载的回答) + document.querySelectorAll('.List-item, .Card.AnswerCard').forEach(function(item){ + let item1 = item.querySelector('.ContentItem.AnswerItem'); + if (item1) { + menu_value('menu_customBlockUsers').forEach(function(item2){ // 遍历用户黑名单 + if (item1.dataset.zop.indexOf('authorName":"' + item2 + '",') > -1) { // 找到就删除该回答 + console.log(item1.dataset.zop) + item.hidden = true; + } + }) + } + }) + } + + function blockUsers_search() { + function blockUsers_now() { + if (location.search.indexOf('type=content') === -1) return // 目前只支持搜索页的 [综合] + document.querySelectorAll('.Card.SearchResult-Card[data-za-detail-view-path-module="AnswerItem"], .Card.SearchResult-Card[data-za-detail-view-path-module="PostItem"]').forEach(function(item1){ + let item = item1.querySelector('.RichText.ztext.CopyrightRichText-richText b'); // 标题所在元素 + if (item) { + for (const keyword of menu_value('menu_customBlockUsers')) { // 遍历关键词黑名单 + if (item.textContent === keyword) { // 找到就删除该信息流 + console.log(item.textContent); + item1.hidden = true; + break; + } + } + } + }) + } + + setTimeout(blockUsers_now, 500); + window.addEventListener('locationchange', function(){ + setTimeout(blockUsers_now, 500); // 网页 URL 变化后再次执行 + }) + + const callback = (mutationsList, observer) => { + if (location.search.indexOf('type=content') === -1) return // 目前只支持搜索页的 [综合] + for (const mutation of mutationsList) { + for (const target of mutation.addedNodes) { + if (target.nodeType != 1) return + if (target.className === 'Card SearchResult-Card' && (target.dataset.zaDetailViewPathModule === 'AnswerItem' || target.dataset.zaDetailViewPathModule === 'PostItem')) { + let item = target.querySelector('.RichText.ztext.CopyrightRichText-richText b'); // 用户名所在元素 + if (item) { + for (const keyword of menu_value('menu_customBlockUsers')) { // 遍历用户名黑名单 + if (item.textContent === keyword) { // 找到就删除该信息流 + console.log(item.textContent); + target.hidden = true; + break; + } + } + } + } + } + } + }; + const observer = new MutationObserver(callback); + observer.observe(document, { childList: true, subtree: true }); + } + + function blockUsers_comment() { + const callback = (mutationsList, observer) => { + for (const mutation of mutationsList) { + for (const target of mutation.addedNodes) { + if (target.nodeType != 1) return + let item = target.querySelector('img.Avatar.UserLink-avatar') + if (item) { + menu_value('menu_customBlockUsers').forEach(function(item1){ // 遍历用户黑名单 + if (item.alt === item1) { // 找到就删除该搜索结果 + if (findParentElement(item, 'NestComment--rootComment', true)) { + findParentElement(item, 'NestComment--rootComment', true).hidden = true;; + } else if (findParentElement(item, 'NestComment--child', true)){ + findParentElement(item, 'NestComment--child', true).hidden = true;; + } else if (findParentElement(item, 'NestComment', true)){ + findParentElement(item, 'NestComment', true).hidden = true;; + } else if (findParentElement(item, 'CommentItemV2', true)){ + findParentElement(item, 'CommentItemV2', true).hidden = true;; + } else if (findParentElement(item, 'CommentItemV2 CommentItemV2--highlighted', true)){ + findParentElement(item, 'CommentItemV2 CommentItemV2--highlighted', true).hidden = true;; + } + } + }) + + // 添加屏蔽用户按钮(点赞、回复等按钮后面) + if (item) { + let footer = findParentElement(item, 'CommentItemV2-meta', true).parentElement.querySelector('.CommentItemV2-metaSibling > .CommentItemV2-footer'), + userid = item.parentElement; + if (userid && footer && !footer.lastElementChild.dataset.name) { + userid = userid.href.split('/')[4]; + footer.insertAdjacentHTML('beforeend',``); + footer.lastElementChild.onclick = function(){blockUsers_button_add(this.dataset.name, this.dataset.userid, false)} + } + } + } + } + } + }; + const observer = new MutationObserver(callback); + observer.observe(document, { childList: true, subtree: true }); + } + + // 添加屏蔽用户按钮(用户信息悬浮框中) + function blockUsers_button() { + const callback = (mutationsList, observer) => { + for (const mutation of mutationsList) { + for (const target of mutation.addedNodes) { + if (target.nodeType != 1) return + //console.log(target, target.className) + if (target.className && (target.className.indexOf('Popover-content Popover-content--top HoverCard-popoverTarget') > -1 || target.className.indexOf('Popover-content Popover-content--bottom HoverCard-popoverTarget') > -1) || target.querySelector('.Popover-content.Popover-content--top.HoverCard-popoverTarget') || target.querySelector('.Popover-content.Popover-content--bottom.HoverCard-popoverTarget')) { + let item = target.querySelector('.MemberButtonGroup.ProfileButtonGroup.HoverCard-buttons'), + item1 = target.querySelector('a.UserLink-link'), + name = item1.textContent, + userid = item1.href.split('/')[4]; + if (item && !target.querySelector('button[data-name][data-userid]')) { + item.insertAdjacentHTML('beforeend', ``); + item.lastElementChild.onclick = function(){blockUsers_button_add(this.dataset.name, this.dataset.userid, false)} + } + } + } + } + }; + const observer = new MutationObserver(callback); + observer.observe(document, { childList: true, subtree: true }); + } + + // 添加屏蔽用户按钮(用户主页) + function blockUsers_button_people() { + let item = document.querySelector('.MemberButtonGroup.ProfileButtonGroup.ProfileHeader-buttons'), // 获取按钮元素位置 + name = document.querySelector('.ProfileHeader-name').firstChild.textContent, // 获取用户名 + users = menu_value('menu_customBlockUsers'), // 读取屏蔽列表 + userid = location.href.split('/')[4]; + for (let num = 0;num