|
3 | 3 | // @name:zh-CN 知乎增强 |
4 | 4 | // @name:zh-TW 知乎增強 |
5 | 5 | // @name:ru Улучшение Zhihu |
6 | | -// @version 2.3.16 |
| 6 | +// @version 2.3.17 |
7 | 7 | // @author X.I.U |
8 | 8 | // @description A more personalized Zhihu experience~ |
9 | | -// @description:zh-CN 移除登录弹窗、屏蔽指定类别(视频、盐选、文章、想法、关注[赞同/关注了XX]等)、屏蔽用户、屏蔽关键词、默认收起回答、快捷收起回答/评论(左键两侧)、快捷回到顶部(右键两侧)、区分问题文章、移除高亮链接、净化搜索热门、净化标题消息、展开问题描述、显示问题作者、默认高清原图(无水印)、置顶显示时间、完整问题时间、直达问题按钮、默认站外直链... |
10 | | -// @description:zh-TW 移除登錄彈窗、屏蔽指定類別(視頻、鹽選、文章、想法、關注[贊同/關注了XX]等)、屏蔽用戶、屏蔽關鍵詞、默認收起回答、快捷收起回答/評論、快捷回到頂部、區分問題文章、移除高亮鏈接、默認高清原圖(無水印)、默認站外直鏈... |
| 9 | +// @description:zh-CN 移除登录弹窗、屏蔽指定类别(视频、盐选、文章、想法、关注[赞同/关注了XX]等)、屏蔽低赞/低评回答、屏蔽用户、屏蔽关键词、默认收起回答、快捷收起回答/评论(左键两侧)、快捷回到顶部(右键两侧)、区分问题文章、移除高亮链接、净化搜索热门、净化标题消息、展开问题描述、显示问题作者、默认高清原图(无水印)、置顶显示时间、完整问题时间、直达问题按钮、默认站外直链... |
| 10 | +// @description:zh-TW 移除登錄彈窗、屏蔽指定類別(視頻、鹽選、文章、想法、關注[贊同/關注了XX]等)、屏蔽低贊/低評回答、屏蔽用戶、屏蔽關鍵詞、默認收起回答、快捷收起回答/評論、快捷回到頂部、區分問題文章、移除高亮鏈接、默認高清原圖(無水印)、默認站外直鏈... |
11 | 11 | // @description:ru Более персонализированный опыт пользования сайтом Zhihu~ |
12 | 12 | // @match *://www.zhihu.com/* |
13 | 13 | // @match *://zhuanlan.zhihu.com/* |
@@ -36,6 +36,8 @@ var menu_ALL = [ |
36 | 36 | ['menu_collapsedAnswer', '一键收起回答/评论', '一键收起回答/评论', true], |
37 | 37 | ['menu_collapsedNowAnswer', '快捷收起回答/评论 (点击两侧空白处)', '快捷收起回答/评论', true], |
38 | 38 | ['menu_backToTop', '快捷回到顶部 (右键两侧空白处)', '快捷回到顶部', true], |
| 39 | + ['menu_blockLowUpvoteCount', '屏蔽低赞回答', '屏蔽低赞回答', ''], |
| 40 | + ['menu_blockLowCommentCount', '屏蔽低评回答', '屏蔽低评回答', ''], |
39 | 41 | ['menu_blockUsers', '屏蔽指定用户', '屏蔽指定用户', true], |
40 | 42 | ['menu_customBlockUsers', '自定义屏蔽用户', '自定义屏蔽用户', ['故事档案局', '盐选推荐', '盐选科普', '盐选成长计划', '知乎盐选会员', '知乎盐选创作者', '盐选心理', '盐选健康必修课', '盐选奇妙物语', '盐选生活馆', '盐选职场', '盐选文学甄选', '盐选作者小管家', '盐选博物馆', '盐选点金', '盐选测评室', '盐选科技前沿', '盐选会员精品']], |
41 | 43 | ['menu_blockKeywords', '屏蔽指定关键词', '屏蔽指定关键词', true], |
@@ -73,7 +75,11 @@ function registerMenuCommand() { |
73 | 75 | } |
74 | 76 | for (let i=0;i<menu_ALL.length;i++){ // 循环注册脚本菜单 |
75 | 77 | menu_ALL[i][3] = GM_getValue(menu_ALL[i][0]); |
76 | | - if (menu_ALL[i][0] === 'menu_customBlockUsers') { // 只有 [屏蔽指定用户] 启用时,才注册菜单 [自定义屏蔽用户] |
| 78 | + if (menu_ALL[i][0] === 'menu_blockLowUpvoteCount') { |
| 79 | + menu_ID[i] = GM_registerMenuCommand(`#️⃣ ${menu_ALL[i][1]}`, function(){customBlockLowCount(menu_ALL[i][0],'设置要屏蔽 低于多少赞同 的回答?\n(例如设置 50 则赞同数低于 50 的回答会被屏蔽\n(目前该功能适用于 首页信息流、问题页\n(点击 [确定] 修改后,后续加载的回答会立即生效,不影响当前已有\n(如不需要请留空并直接点击 [确定] 即可')}); |
| 80 | + } else if (menu_ALL[i][0] === 'menu_blockLowCommentCount') { |
| 81 | + menu_ID[i] = GM_registerMenuCommand(`#️⃣ ${menu_ALL[i][1]}`, function(){customBlockLowCount(menu_ALL[i][0],'设置要屏蔽 低于多少评价 的回答?\n(例如设置 20 则评价数低于 20 的回答会被屏蔽\n(目前该功能适用于 首页信息流、问题页\n(点击 [确定] 修改后,后续加载的回答会立即生效,不影响当前已有\n(如不需要请留空并直接点击 [确定] 即可')}); |
| 82 | + } else if (menu_ALL[i][0] === 'menu_customBlockUsers') { // 只有 [屏蔽指定用户] 启用时,才注册菜单 [自定义屏蔽用户] |
77 | 83 | if (menu_value('menu_blockUsers')) menu_ID[i] = GM_registerMenuCommand(`#️⃣ ${menu_ALL[i][1]}`, function(){customBlockUsers()}); |
78 | 84 | } else if (menu_ALL[i][0] === 'menu_customBlockKeywords') { // 只有 [屏蔽指定关键词] 启用时,才注册菜单 [自定义屏蔽关键词] |
79 | 85 | if (menu_value('menu_blockKeywords')) menu_ID[i] = GM_registerMenuCommand(`#️⃣ ${menu_ALL[i][1]}`, function(){customBlockKeywords()}); |
@@ -423,6 +429,78 @@ function isElementInViewport_(el) { |
423 | 429 | } |
424 | 430 |
|
425 | 431 |
|
| 432 | +// 自定义屏蔽低赞/低评回答 |
| 433 | +function customBlockLowCount(menu, info) { |
| 434 | + let newCount = prompt(info, menu_value(menu)); |
| 435 | + if (newCount == '' || /^(0|[1-9]\d*)$/.test(newCount)) { // 检查是否是有效整数 |
| 436 | + GM_setValue(menu, newCount); |
| 437 | + registerMenuCommand(); // 重新注册脚本菜单 |
| 438 | + } |
| 439 | +}; |
| 440 | + |
| 441 | + |
| 442 | +// 屏蔽低赞/低评回答 |
| 443 | +function blockLowCount(type) { |
| 444 | + switch(type) { |
| 445 | + case 'index': |
| 446 | + blockLowCount_('.Card.TopstoryItem.TopstoryItem-isRecommend', 'Card TopstoryItem TopstoryItem-isRecommend'); |
| 447 | + break; |
| 448 | + case 'question': |
| 449 | + blockLowCount_('.List-item', 'List-item'); |
| 450 | + break; |
| 451 | + } |
| 452 | + |
| 453 | + |
| 454 | + function blockLowCount_(className1, className2) { |
| 455 | + // 前几条因为是直接加载的,而不是动态插入网页的,所以需要单独判断 |
| 456 | + function blockLowCount_now() { |
| 457 | + document.querySelectorAll(className1).forEach(function(item1){ |
| 458 | + blockLowCount_1(item1,'menu_blockLowUpvoteCount','meta[itemprop=upvoteCount]'); |
| 459 | + blockLowCount_1(item1,'menu_blockLowCommentCount','meta[itemprop=commentCount]'); |
| 460 | + }) |
| 461 | + } |
| 462 | + |
| 463 | + blockLowCount_now(); |
| 464 | + window.addEventListener('urlchange', function(){ |
| 465 | + setTimeout(blockLowCount_now, 1000); // 网页 URL 变化后再次执行 |
| 466 | + }) |
| 467 | + |
| 468 | + // 这个是监听网页插入事件,用来判断后续网页动态插入的元素 |
| 469 | + const callback = (mutationsList, observer) => { |
| 470 | + for (const mutation of mutationsList) { |
| 471 | + for (const target of mutation.addedNodes) { |
| 472 | + if (target.nodeType != 1) return |
| 473 | + if (target.className === className2) { |
| 474 | + blockLowCount_1(target,'menu_blockLowUpvoteCount','meta[itemprop=upvoteCount]'); |
| 475 | + blockLowCount_1(target,'menu_blockLowCommentCount','meta[itemprop=commentCount]'); |
| 476 | + } |
| 477 | + } |
| 478 | + } |
| 479 | + }; |
| 480 | + const observer = new MutationObserver(callback); |
| 481 | + observer.observe(document, { childList: true, subtree: true }); |
| 482 | + } |
| 483 | + |
| 484 | + |
| 485 | + function blockLowCount_1(item1, menu, css) { |
| 486 | + if (menu_value(menu)) { |
| 487 | + let item = item1.querySelector(css); |
| 488 | + //console.log(item) |
| 489 | + if (item && item.content && Number(item.content) < Number(menu_value(menu))) { |
| 490 | + if (menu == 'menu_blockLowUpvoteCount') { |
| 491 | + console.log('已屏蔽低赞回答:', item.content + '<' + menu_value(menu), item1); |
| 492 | + } else { |
| 493 | + console.log('已屏蔽低评回答:', item.content + '<' + menu_value(menu), item1); |
| 494 | + } |
| 495 | + item1.hidden = true; |
| 496 | + item1.style.display = 'none'; |
| 497 | + } |
| 498 | + } |
| 499 | + } |
| 500 | +} |
| 501 | + |
| 502 | + |
| 503 | + |
426 | 504 | // 自定义屏蔽用户 |
427 | 505 | function customBlockUsers() { |
428 | 506 | let nowBlockUsers = ''; |
@@ -1551,6 +1629,9 @@ function blockHotOther() { |
1551 | 1629 | collapsedNowAnswer('.QuestionPage'); // 收起当前回答 + 快捷返回顶部 |
1552 | 1630 | collapsedNowAnswer('.Question-main'); // 收起当前回答 + 快捷返回顶部 |
1553 | 1631 | questionRichTextMore(); // 展开问题描述 |
| 1632 | + if (location.pathname.indexOf('answer') == -1) { // 问题页而不是回答页 |
| 1633 | + blockLowCount('question'); // 屏蔽低赞/低评回答 |
| 1634 | + } |
1554 | 1635 | blockUsers('question'); // 屏蔽指定用户 |
1555 | 1636 | blockYanXuan(); // 屏蔽盐选内容 |
1556 | 1637 | blockType('question'); // 屏蔽指定类别(视频/文章等) |
@@ -1629,6 +1710,7 @@ function blockHotOther() { |
1629 | 1710 | addTypeTips(); // 区分问题文章 |
1630 | 1711 | addToQuestion(); // 直达问题按钮 |
1631 | 1712 | if (location.pathname == '/') { // 推荐 |
| 1713 | + blockLowCount('index'); // 屏蔽低赞/低评回答 |
1632 | 1714 | blockUsers('index'); // 屏蔽指定用户 |
1633 | 1715 | blockKeywords('index'); // 屏蔽指定关键词 |
1634 | 1716 | blockType(); // 屏蔽指定类别(视频/文章等) |
|
0 commit comments