// ==UserScript== // @name 知乎增强 // @name:zh-CN 知乎增强 // @name:zh-TW 知乎增強 // @name:en Zhihu enhancement // @version 2.0.1 // @author X.I.U // @description 移除登录弹窗、屏蔽首页视频、默认收起回答、快捷收起回答/评论(左键两侧)、快捷回到顶部(右键两侧)、屏蔽用户、屏蔽关键词、移除高亮链接、屏蔽盐选内容、净化搜索热门、净化标题消息、展开问题描述、显示问题作者、置顶显示时间、完整问题时间、区分问题文章、直达问题按钮、默认高清原图、默认站外直链 // @description:zh-TW 移除登錄彈窗、屏蔽首頁視頻、默認收起回答、快捷收起回答/評論、快捷回到頂部、屏蔽用戶、屏蔽關鍵詞、移除高亮鏈接、屏蔽鹽選內容、淨化搜索熱門、淨化標題消息、置頂顯示時間、完整問題時間、區分問題文章、默認高清原圖、默認站外直鏈... // @description:en A more personalized Zhihu experience~ // @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 // @grant window.onurlchange // @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 // @downloadURL none // ==/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_cleanSearch', '净化搜索热门 (默认搜索词及热门搜索)', '净化搜索热门', false], ['menu_cleanTitles', '净化标题消息 (标题中的私信/消息)', '净化标题提醒', false], ['menu_questionRichTextMore', '展开问题描述', '展开问题描述', false], ['menu_publishTop', '置顶显示时间', '置顶显示时间', true], ['menu_typeTips', '区分问题文章', '区分问题文章', true], ['menu_toQuestion', '直达问题按钮', '直达问题按钮', 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')) { for (const addedNode of mutation.addedNodes) { if (addedNode.nodeType != Node.ELEMENT_NODE) continue if (addedNode.className != 'RichContent-inner') continue if (addedNode.offsetHeight < 400) break //console.log('111',addedNode, addedNode.classList, addedNode.classList.contains('RichContent-inner'), addedNode.offsetHeight, addedNode.textContent.length) const button = mutation.target.querySelector('.ContentItem-actions.Sticky [data-zop-retract-question]'); if (button) { mutation.target.setAttribute('script-collapsed', ''); button.click(); return } } // 长的回答 } else if (mutation.target.tagName === 'DIV' && !mutation.target.style.cssText && !mutation.target.className) { if (mutation.target.parentElement.hasAttribute('script-collapsed')) return //console.log('222',mutation.target, mutation.target.querySelector('.ContentItem-actions.Sticky [data-zop-retract-question]')) const button = mutation.target.querySelector('.ContentItem-actions.Sticky [data-zop-retract-question]'); if (button) { mutation.target.parentElement.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('urlchange', 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 //console.log('1111', document.querySelector('.CornerAnimayedFlex')) if (document.querySelector('.CornerAnimayedFlex') && !document.getElementById('collapsed-button')) { //console.log('2222') 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('urlchange', 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') //console.log('111') if (commentCollapseButton && commentCollapseButton.textContent.indexOf('收起评论') > -1) commentCollapseButton.click(); // 再去收起回答 rightButton = rightButton.querySelector('.ContentItem-rightButton[data-zop-retract-question]') //console.log('222') 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') // 如果展开了评论,就收起评论 //console.log('333') if (commentCollapseButton && commentCollapseButton.textContent.indexOf('收起评论') > -1) commentCollapseButton.click(); //console.log('444') 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') // 如果展开了评论,就收起评论 //console.log('555') if (commentCollapseButton && commentCollapseButton.textContent.indexOf('收起评论') > -1) commentCollapseButton.click(); let answerCollapseButton__ = el.querySelector('.ContentItem-rightButton[data-zop-retract-question]'); //console.log('666') if (answerCollapseButton__) answerCollapseButton__.click() // 再去收起回答 break } } } } // 下面这段只针对 [收起评论](如果展开了的话) let commentCollapseButton_ = false, commentCollapseButton__ = false; // 悬浮的 [收起评论](此时正在浏览评论内容 [中间区域]) let commentCollapseButton = document.querySelector('.CommentCollapseButton') if (commentCollapseButton) { //console.log('777') 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)) { //console.log('888') 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) { //console.log('999') 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) { //console.log('101010') 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}) //console.log(nowBlockUsers.replace('|','')) 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-isRecommend', 'Card TopstoryItem 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 (keyword != '' && item.dataset.zop.indexOf('authorName":"' + keyword + '",') > -1) { // 找到就删除该信息流 console.log(item.dataset.zop); item1.hidden = true; break; } } } }) } blockKeywords_now(); window.addEventListener('urlchange', 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 (keyword != '' && 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 (keyword != '' && item.textContent === keyword) { // 找到就删除该信息流 console.log(item.textContent); item1.hidden = true; break; } } } }) } setTimeout(blockUsers_now, 500); window.addEventListener('urlchange', 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 (keyword != '' && 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