From 9c837248d6f751618e1b5e4aa74b6d955662a1e3 Mon Sep 17 00:00:00 2001 From: xiu2 <54703944+XIU2@users.noreply.github.com> Date: Tue, 30 Mar 2021 21:40:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20[=E6=94=B6=E8=B5=B7?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E5=9B=9E=E7=AD=94/=E8=AF=84=E8=AE=BA]=20?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=88=E8=A7=A3=E5=86=B3=E4=BA=86=E5=9C=A8?= =?UTF-8?q?=E6=97=A2=E7=9C=8B=E4=B8=8D=E5=88=B0=E5=9B=BA=E5=AE=9A=E7=9A=84?= =?UTF-8?q?=20[=E6=94=B6=E8=B5=B7=E8=AF=84=E8=AE=BA]=20=E5=8F=88=E7=9C=8B?= =?UTF-8?q?=E4=B8=8D=E5=88=B0=E6=82=AC=E6=B5=AE=E7=9A=84=20[=E6=94=B6?= =?UTF-8?q?=E8=B5=B7=E8=AF=84=E8=AE=BA]=20=E6=97=B6=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E6=94=B6=E8=B5=B7=E8=AF=84=E8=AE=BA=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?)=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Zhihu-Enhanced.user.js | 398 +++++++++++++++++++++-------------------- 1 file changed, 208 insertions(+), 190 deletions(-) diff --git a/Zhihu-Enhanced.user.js b/Zhihu-Enhanced.user.js index 6b5b2ce..2a9e431 100644 --- a/Zhihu-Enhanced.user.js +++ b/Zhihu-Enhanced.user.js @@ -1,6 +1,6 @@ // ==UserScript== // @name 知乎增强 -// @version 1.3.2 +// @version 1.3.3 // @author X.I.U // @description 移除登录弹窗、一键收起回答、收起当前回答/评论(点击两侧空白处)、快捷回到顶部(右键两侧空白处)、置顶显示时间、显示问题时间、区分问题文章、默认高清原图、默认站外直链 // @match *://www.zhihu.com/* @@ -69,6 +69,212 @@ function menu_value(menuName) { } +// 一键收起回答 +function collapsedAnswer(){ + if(menu_value('menu_collapsedAnswer')){ + let button_Add = `` + let style_Add = document.createElement('style'); + style_Add.innerHTML = '.CornerButton{margin-bottom:8px !important;}.CornerButtons{bottom:45px !important;}'; + document.head.appendChild(style_Add); + $(".CornerAnimayedFlex").prepend(button_Add); + $("#collapsed-button").on("click", function () { + document.querySelectorAll('.ContentItem-rightButton').forEach(function (el) { + if (el.hasAttribute('data-zop-retract-question')) { + el.click() + } + }); + }) + } +} + + +// 收起当前回答、评论(监听点击事件,点击网页两侧空白处) +function collapsedNowAnswer(selectors){ + backToTop(selectors) + if(menu_value('menu_collapsedNowAnswer')){ + 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') + if(commentCollapseButton && commentCollapseButton.innerText.indexOf("收起评论") > -1) { + commentCollapseButton.click(); + } + // 再去收起回答 + rightButton = rightButton.querySelector('.ContentItem-rightButton') + if(rightButton && rightButton.hasAttribute('data-zop-retract-question')) { + rightButton.click(); + } + }else{ // 固定的 [收起回答](此时正在浏览回答内容 [尾部区域]) + for (let el of document.querySelectorAll('.ContentItem-rightButton')) { + if (el.hasAttribute('data-zop-retract-question')) { + if (isElementInViewport(el)) { + // 固定的 [收起评论](先看看是否展开评论) + let commentCollapseButton = el.parentNode.querySelector('button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel') + if(commentCollapseButton && commentCollapseButton.innerText.indexOf("收起评论") > -1) { + commentCollapseButton.click(); + } + el.click() // 再去收起回答 + break + } + } + } + } + + var commentCollapseButton_ = false; + // 悬浮的 [收起评论](此时正在浏览评论内容 [中间区域]) + let commentCollapseButton = document.querySelector('.CommentCollapseButton') + if(commentCollapseButton) { + commentCollapseButton.click(); + }else{ // 固定的 [收起评论](此时正在浏览评论内容 [头部区域]) + for (let el of document.querySelectorAll('button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel')) { + if (el.innerText.indexOf("收起评论") > -1) { + if (isElementInViewport(el)) { + el.click() + commentCollapseButton_ = true // 如果找到并点击了,就没必要执行下面的代码了(可视区域中没有 [收起评论] 时) + break + } + } + } + if(commentCollapseButton_ == false){ // 可视区域中没有 [收起评论] 时(此时正在浏览评论内容 [头部区域] + [尾部区域](不上不下的,既看不到固定的 [收起评论] 又看不到悬浮的 [收起评论])),需要判断可视区域中是否存在评论元素 + for (let el of document.querySelectorAll('.NestComment')) { + if (isElementInViewport(el)) { + let commentCollapseButton = el.parentNode.parentNode.parentNode.parentNode.parentNode.querySelector('button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel') + if (commentCollapseButton.innerText.indexOf("收起评论") > -1) { + commentCollapseButton.click() + break + } + } + } + } + } + } + } + } +} + + +// 回到顶部(监听点击事件,鼠标右键点击网页两侧空白处) +function backToTop(selectors){ + if(menu_value('menu_backToTop')){ + 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) + ); +} + + +var postNum; +// 区分问题文章 +function addTypeTips() { + if(menu_value('menu_typeTips')){ + // URL 匹配正则表达式 + let patt_zhuanlan = /zhuanlan.zhihu.com/, + patt_question = /question\/\d+/, + patt_question_answer = /answer\/\d+/, + patt_video = /\/zvideo\//, + patt_tip = /zhihu_e_tips/ + let postList = document.querySelectorAll('h2.ContentItem-title a'); + postNum = document.querySelectorAll('small.zhihu_e_tips'); + //console.log(`${postList.length} ${postNum.length}`) + if (postList.length > postNum.length){ + for(let num = postNum.length;num文章 ` + postList[num].innerHTML + }else if (patt_question.test(postList[num].href)){ // 如果是问题 + if (patt_question_answer.test(postList[num].href)){ // 如果是指向回答的问题(而非指向纯问题的链接) + postList[num].innerHTML = `问题 ` + postList[num].innerHTML + }else{ + postList[num].innerHTML = `问题 ` + postList[num].innerHTML + } + }else if (patt_video.test(postList[num].href)){ // 如果是视频 + postList[num].innerHTML = `视频 ` + postList[num].innerHTML + } + //postNum += 1; + } + } + } + } +} + + +// 监听 网页插入元素 事件 +function addEventListener_DOMNodeInserted() { + // 知乎免登录,来自:https://greasyfork.org/zh-CN/scripts/417126 + let removeLoginModal = e => { + if (e.target.innerHTML && e.target.getElementsByClassName('Modal-wrapper').length > 0) { + if (e.target.getElementsByClassName('Modal-wrapper')[0].querySelector('.signFlowModal')){ + e.target.getElementsByClassName('Modal-wrapper')[0].remove(); + } + setTimeout(() => {document.documentElement.style.overflowY = 'scroll';}, 0); + } + } + + // 收起当前评论(监听点击事件,点击网页两侧空白处) + let collapseNowComment = e => { + if (e.target.innerHTML && e.target.getElementsByClassName('Modal-wrapper Modal-enter').length > 0) { + document.getElementsByClassName('Modal-backdrop')[0].onclick = function(event){ + if (event.target==this) { + let closeButton = document.getElementsByClassName('Modal-closeButton')[0] + if(closeButton) { + closeButton.click(); + } + } + } + } + } + + if (document.querySelector('button.AppHeader-login')){ // 未登录时才会监听并移除登录弹窗 + document.addEventListener('DOMNodeInserted', removeLoginModal); + document.querySelector('button.AppHeader-login').onclick=function(){location.href='https://www.zhihu.com/signin';} // [登录]按钮跳转至登录页面 + document.querySelector('.AppHeader-profile button.Button--primary').onclick=function(){location.href='https://www.zhihu.com/signin';} // [加入知乎]按钮跳转至注册页面(实际上是同一个页面) + } else if(window.location.href.indexOf("zhuanlan") > -1){ + document.addEventListener('DOMNodeInserted', removeLoginModal); + } + document.addEventListener('DOMNodeInserted', collapseNowComment); // 收起当前评论(监听点击事件,点击网页两侧空白处) +} + + +// 监听 XMLHttpRequest 事件 +function EventXMLHttpRequest() { + var _send = window.XMLHttpRequest.prototype.send + function sendReplacement(data) { + //console.log(`111111`); + addTypeTips(); + return _send.apply(this, arguments); + } + window.XMLHttpRequest.prototype.send = sendReplacement; +} + +/*(function (open) { + XMLHttpRequest.prototype.open = function () { + this.addEventListener("readystatechange", function () { + //console.log(this.responseURL); + }, false); + open.apply(this, arguments); + }; +})(XMLHttpRequest.prototype.open);*/ + + // 置顶显示时间 - 首页,来自:https://greasyfork.org/scripts/402808 function topTime_index() { @@ -339,6 +545,7 @@ function directLink () { $(".TopstoryItem--advertCard").hide(); } + // 默认高清原图,来自:https://greasyfork.org/scripts/402808 function originalPic(){ $("img").each(function(){ @@ -351,199 +558,10 @@ function originalPic(){ $(".Modal-inner").css({"overflow-y":"hidden"}) } -// 一键收起回答 -function collapsedAnswer(){ - if(menu_value('menu_collapsedAnswer')){ - let button_Add = `` - let style_Add = document.createElement('style'); - style_Add.innerHTML = '.CornerButton{margin-bottom:8px !important;}.CornerButtons{bottom:45px !important;}'; - document.head.appendChild(style_Add); - $(".CornerAnimayedFlex").prepend(button_Add); - $("#collapsed-button").on("click", function () { - document.querySelectorAll('.ContentItem-rightButton').forEach(function (el) { - if (el.hasAttribute('data-zop-retract-question')) { - el.click() - } - }); - }) - } -} - - -// 收起当前回答、评论(监听点击事件,点击网页两侧空白处) -function collapsedNowAnswer(selectors){ - backToTop(selectors) - if(menu_value('menu_collapsedNowAnswer')){ - 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') - if(commentCollapseButton && commentCollapseButton.innerText.indexOf("收起评论") > -1) { - commentCollapseButton.click(); - } - // 悬浮的 [收起回答] - rightButton = rightButton.querySelector('.ContentItem-rightButton') - if(rightButton && rightButton.hasAttribute('data-zop-retract-question')) { - rightButton.click(); - } - }else{ // 固定的 [收起回答] - document.querySelectorAll('.ContentItem-rightButton').forEach(function (el) { - if (el.hasAttribute('data-zop-retract-question')) { - if (isElementInViewport(el)) { - // 固定的 [收起评论] - let commentCollapseButton = el.parentNode.querySelector('button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel') - if(commentCollapseButton && commentCollapseButton.innerText.indexOf("收起评论") > -1) { - commentCollapseButton.click(); - } - el.click() - } - } - }) - } - - // 悬浮的 [收起评论] - let commentCollapseButton = document.querySelector('.CommentCollapseButton') - if(commentCollapseButton) { - commentCollapseButton.click(); - }else{ // 固定的 [收起评论](针对短篇没有收起按钮的回答) - document.querySelectorAll('button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel').forEach(function (el) { - if (el.innerText.indexOf("收起评论") > -1) { - if (isElementInViewport(el)) { - el.click() - } - } - }) - } - } - } - } -} - - -// 回到顶部(监听点击事件,鼠标右键点击网页两侧空白处) -function backToTop(selectors){ - if(menu_value('menu_backToTop')){ - 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) - ); -} - - -var postNum; -// 区分问题文章 -function addTypeTips() { - if(menu_value('menu_typeTips')){ - // URL 匹配正则表达式 - let patt_zhuanlan = /zhuanlan.zhihu.com/, - patt_question = /question\/\d+/, - patt_question_answer = /answer\/\d+/, - patt_video = /\/zvideo\//, - patt_tip = /zhihu_e_tips/ - let postList = document.querySelectorAll('h2.ContentItem-title a'); - postNum = document.querySelectorAll('small.zhihu_e_tips'); - //console.log(`${postList.length} ${postNum.length}`) - if (postList.length > postNum.length){ - for(let num = postNum.length;num文章 ` + postList[num].innerHTML - }else if (patt_question.test(postList[num].href)){ // 如果是问题 - if (patt_question_answer.test(postList[num].href)){ // 如果是指向回答的问题(而非指向纯问题的链接) - postList[num].innerHTML = `问题 ` + postList[num].innerHTML - }else{ - postList[num].innerHTML = `问题 ` + postList[num].innerHTML - } - }else if (patt_video.test(postList[num].href)){ // 如果是视频 - postList[num].innerHTML = `视频 ` + postList[num].innerHTML - } - //postNum += 1; - } - } - } - } -} - -// 监听 网页插入元素 事件 -function addEventListener_DOMNodeInserted() { - // 知乎免登录,来自:https://greasyfork.org/zh-CN/scripts/417126 - let removeLoginModal = e => { - if (e.target.innerHTML && e.target.getElementsByClassName('Modal-wrapper').length > 0) { - if (e.target.getElementsByClassName('Modal-wrapper')[0].querySelector('.signFlowModal')){ - e.target.getElementsByClassName('Modal-wrapper')[0].remove(); - } - setTimeout(() => {document.documentElement.style.overflowY = 'scroll';}, 0); - } - } - - // 收起当前评论(监听点击事件,点击网页两侧空白处) - let collapseNowComment = e => { - if (e.target.innerHTML && e.target.getElementsByClassName('Modal-wrapper Modal-enter').length > 0) { - document.getElementsByClassName('Modal-backdrop')[0].onclick = function(event){ - if (event.target==this) { - let closeButton = document.getElementsByClassName('Modal-closeButton')[0] - if(closeButton) { - closeButton.click(); - } - } - } - } - } - - if (document.querySelector('button.AppHeader-login')){ // 未登录时才会监听并移除登录弹窗 - document.addEventListener('DOMNodeInserted', removeLoginModal); - document.querySelector('button.AppHeader-login').onclick=function(){location.href='https://www.zhihu.com/signin';} // [登录]按钮跳转至登录页面 - document.querySelector('.AppHeader-profile button.Button--primary').onclick=function(){location.href='https://www.zhihu.com/signin';} // [加入知乎]按钮跳转至注册页面(实际上是同一个页面) - } else if(window.location.href.indexOf("zhuanlan") > -1){ - document.addEventListener('DOMNodeInserted', removeLoginModal); - } - document.addEventListener('DOMNodeInserted', collapseNowComment); // 收起当前评论(监听点击事件,点击网页两侧空白处) -} - - -// 监听 XMLHttpRequest 事件 -function EventXMLHttpRequest() { - var _send = window.XMLHttpRequest.prototype.send - function sendReplacement(data) { - //console.log(`111111`); - addTypeTips(); - return _send.apply(this, arguments); - } - window.XMLHttpRequest.prototype.send = sendReplacement; -} - -/*(function (open) { - XMLHttpRequest.prototype.open = function () { - this.addEventListener("readystatechange", function () { - //console.log(this.responseURL); - }, false); - open.apply(this, arguments); - }; -})(XMLHttpRequest.prototype.open);*/ (function() { addEventListener_DOMNodeInserted(); // 监听 网页插入元素 事件 - // 默认折叠邀请,来自:https://greasyfork.org/scripts/402808 let timer=setInterval(function(){ if($(".QuestionInvitation-content").text().indexOf("更多推荐结果") > -1)