|
1 | 1 | // ==UserScript== |
2 | 2 | // @name 知乎增强 |
3 | | -// @version 1.5.2 |
| 3 | +// @version 1.5.3 |
4 | 4 | // @author X.I.U |
5 | 5 | // @description 移除登录弹窗、一键收起回答、收起当前回答/评论(点击两侧空白处)、快捷回到顶部(右键两侧空白处)、屏蔽用户 (发布的内容)、屏蔽关键词(标题/评论)、屏蔽盐选内容、展开问题描述、置顶显示时间、显示问题时间、区分问题文章、默认高清原图、默认站外直链 |
6 | 6 | // @match *://www.zhihu.com/* |
@@ -111,32 +111,46 @@ function collapsedNowAnswer(selectors) { |
111 | 111 | if (event.target==this) { |
112 | 112 | // 下面这段主要是 [收起回答],顺便 [收起评论](如果展开了的话) |
113 | 113 | let rightButton = document.querySelector('.ContentItem-actions.Sticky.RichContent-actions.is-fixed.is-bottom') |
114 | | - // 悬浮在底部的 [收起回答](此时正在浏览回答内容 [头部区域 + 中间区域]) |
| 114 | + // 悬浮在底部的 [收起回答](此时正在浏览回答内容 [中间区域]) |
115 | 115 | if (rightButton) { |
116 | 116 | // 固定的 [收起评论](先看看是否展开评论) |
117 | 117 | let commentCollapseButton = rightButton.querySelector('button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel:first-of-type') |
118 | 118 | if (commentCollapseButton && commentCollapseButton.textContent.indexOf('收起评论') > -1) commentCollapseButton.click(); |
119 | 119 | // 再去收起回答 |
120 | | - rightButton = rightButton.querySelector('.ContentItem-rightButton') |
121 | | - if (rightButton && rightButton.hasAttribute('data-zop-retract-question')) rightButton.click(); |
122 | | - // 固定在回答底部的 [收起回答](此时正在浏览回答内容 [尾部区域]) |
| 120 | + rightButton = rightButton.querySelector('.ContentItem-rightButton[data-zop-retract-question]') |
| 121 | + if (rightButton) rightButton.click(); |
| 122 | + // 固定在回答底部的 [收起回答](此时正在浏览回答内容 [尾部区域]) |
123 | 123 | } else { |
124 | | - for (let el of document.querySelectorAll('.ContentItem-rightButton')) { // 遍历所有回答底部的 [收起] 按钮 |
125 | | - if (el.hasAttribute('data-zop-retract-question')) { |
126 | | - if (isElementInViewport(el)) { // 判断该 [收起] 按钮是否在可视区域内 |
| 124 | + let answerCollapseButton_ = false; |
| 125 | + for (let el of document.querySelectorAll('.ContentItem-rightButton[data-zop-retract-question]')) { // 遍历所有回答底部的 [收起] 按钮 |
| 126 | + if (isElementInViewport(el)) { // 判断该 [收起] 按钮是否在可视区域内 |
| 127 | + // 固定的 [收起评论](先看看是否展开评论,即存在 [收起评论] 按钮) |
| 128 | + let commentCollapseButton = el.parentNode.querySelector('button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel:first-of-type') |
| 129 | + // 如果展开了评论,就收起评论 |
| 130 | + if (commentCollapseButton && commentCollapseButton.textContent.indexOf('收起评论') > -1) commentCollapseButton.click(); |
| 131 | + el.click() // 再去收起回答 |
| 132 | + answerCollapseButton_ = true; // 如果找到并点击收起了,就没必要执行下面的代码了(可视区域中没有 [收起回答] 时) |
| 133 | + break |
| 134 | + } |
| 135 | + } |
| 136 | + // 针对完全看不到 [收起回答] 按钮时(如 [头部区域],以及部分明明很长却不显示悬浮横条的回答) |
| 137 | + if (!answerCollapseButton_) { |
| 138 | + for (let el of document.querySelectorAll('.List-item')) { // 遍历所有回答主体元素 |
| 139 | + if (isElementInViewport_(el)) { // 判断该回答是否在可视区域内 |
127 | 140 | // 固定的 [收起评论](先看看是否展开评论,即存在 [收起评论] 按钮) |
128 | 141 | let commentCollapseButton = el.parentNode.querySelector('button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel:first-of-type') |
129 | 142 | // 如果展开了评论,就收起评论 |
130 | 143 | if (commentCollapseButton && commentCollapseButton.textContent.indexOf('收起评论') > -1) commentCollapseButton.click(); |
131 | | - el.click() // 再去收起回答 |
| 144 | + let answerCollapseButton__ = document.querySelector('.ContentItem-rightButton[data-zop-retract-question]'); |
| 145 | + if (answerCollapseButton__) answerCollapseButton__.click() // 再去收起回答 |
132 | 146 | break |
133 | 147 | } |
134 | 148 | } |
135 | 149 | } |
136 | 150 | } |
137 | 151 |
|
138 | 152 | // 下面这段只针对 [收起评论](如果展开了的话) |
139 | | - var commentCollapseButton_ = false, commentCollapseButton__ = false; |
| 153 | + let commentCollapseButton_ = false, commentCollapseButton__ = false; |
140 | 154 | // 悬浮的 [收起评论](此时正在浏览评论内容 [中间区域]) |
141 | 155 | let commentCollapseButton = document.querySelector('.CommentCollapseButton') |
142 | 156 | if (commentCollapseButton) { |
@@ -202,16 +216,22 @@ function backToTop(selectors) { |
202 | 216 | } |
203 | 217 |
|
204 | 218 |
|
205 | | -//获取元素是否在可视区域 |
| 219 | +//获取元素是否在可视区域(完全可见) |
206 | 220 | function isElementInViewport(el) { |
207 | 221 | let rect = el.getBoundingClientRect(); |
208 | 222 | return ( |
209 | 223 | rect.top >= 0 && |
210 | 224 | rect.left >= 0 && |
211 | | - rect.bottom <= |
212 | | - (window.innerHeight || document.documentElement.clientHeight) && |
213 | | - rect.right <= |
214 | | - (window.innerWidth || document.documentElement.clientWidth) |
| 225 | + rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && |
| 226 | + rect.right <= (window.innerWidth || document.documentElement.clientWidth) |
| 227 | + ); |
| 228 | +} |
| 229 | +//获取元素是否在可视区域(部分可见) |
| 230 | +function isElementInViewport_(el) { |
| 231 | + let rect = el.getBoundingClientRect(); |
| 232 | + return ( |
| 233 | + rect.top <= (window.innerHeight || document.documentElement.clientHeight) && |
| 234 | + rect.left <= (window.innerWidth || document.documentElement.clientWidth) |
215 | 235 | ); |
216 | 236 | } |
217 | 237 |
|
|
0 commit comments