#去除知乎中“鹽選”付費故事

添加油猴腳本,去除知乎中“鹽選”付費故事

// ==UserScript==
// @name         鹽選內容隱藏腳本
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  自動隱藏含有“鹽選專欄”或“鹽選”文字的回答卡片
// @author       YourName
// @match        *://*.zhihu.com/*
// @grant        none
// ==/UserScript==(function() {'use strict';// 配置const observerConfig = {childList: true,subtree: true,attributes: false};// 目標元素選擇器和條件const targets = [{selector: 'div.KfeCollection-OrdinaryLabel-content',keyword: '鹽選專欄'},{selector: 'p.KfeCollection-IntroCard-contentName-newStyle-pc',keyword: '鹽選'}];const ancestorSelector = 'div.Card.TopstoryItem.TopstoryItem-isRecommend';// 隱藏卡片的通用函數const hideCard = (element) => {const ancestor = element.closest(ancestorSelector);if (ancestor) {ancestor.remove();}};// 檢查節點并隱藏匹配的卡片const checkNode = (node) => {targets.forEach(target => {if (node.matches(target.selector) && node.textContent.includes(target.keyword)) {hideCard(node);}Array.from(node.querySelectorAll(target.selector)).forEach(element => {if (element.textContent.includes(target.keyword)) {hideCard(element);}});});};// 創建MutationObserver實例const observer = new MutationObserver(mutations => {mutations.forEach(mutation => {mutation.addedNodes.forEach(node => {if (node.nodeType === Node.ELEMENT_NODE) {checkNode(node);}});});});// 初始檢查已存在的內容const initialCheck = () => {targets.forEach(target => {document.querySelectorAll(target.selector).forEach(element => {if (element.textContent.includes(target.keyword)) {hideCard(element);}});});};// 啟動觀察器observer.observe(document.documentElement, observerConfig);// 頁面加載時執行初始檢查window.addEventListener('load', initialCheck);
})();

二、附加解釋

MutationObserver 是一個用于監聽 DOM 樹變化的 JavaScript API。它允許你實時檢測網頁中元素的變化(如添加、刪除節點或屬性修改),非常適合處理動態加載的內容,比如知乎頁面中通過 AJAX 加載的推薦卡片。以下是對腳本中 MutationObserver 使用的詳細解釋:
  1. MutationObserver 的作用
    MutationObserver 提供了一種高效的方式來監聽 DOM 變化,而無需輪詢或依賴定時器。在你的腳本中,它用于檢測知乎頁面中新增的 DOM 節點(例如新加載的推薦卡片),并檢查這些節點是否包含“鹽選”相關內容,以便隱藏對應的卡片。
  2. 腳本中 MutationObserver 的使用
    以下是腳本中 MutationObserver 的具體實現和步驟:
    a. 創建 MutationObserver 實例
const observer = new MutationObserver(mutations => {mutations.forEach(mutation => {mutation.addedNodes.forEach(node => {if (node.nodeType === Node.ELEMENT_NODE) {checkNode(node);}});});
});

new MutationObserver(callback):創建一個觀察者實例,callback 是一個函數,當 DOM 發生變化時會被調用。
回調函數:接收 mutations 參數(一個 MutationRecord 數組),每個 MutationRecord 描述一次 DOM 變化。
處理邏輯:
遍歷 mutations 中的每個變化。
檢查 mutation.addedNodes(新增的節點列表)。
只處理元素節點(node.nodeType === Node.ELEMENT_NODE),忽略文本節點等。
對每個新增元素調用 checkNode 函數,檢查是否需要隱藏卡片。
b. 配置觀察器

const observerConfig = {childList: true,subtree: true,attributes: false
};

observerConfig:定義觀察器的監聽范圍和類型:
childList: true:監聽目標節點及其子節點的添加或刪除。
subtree: true:監聽目標節點的所有后代節點(不僅是直接子節點)。
attributes: false:不監聽屬性變化(因為腳本只關心節點增刪)。
這種配置確保腳本能捕捉頁面中任何位置的新增節點(如動態加載的推薦卡片)。
c. 啟動觀察

observer.observe(document.documentElement, observerConfig);

observer.observe(target, config):開始觀察指定的目標節點。
目標節點:document.documentElement(即 元素),覆蓋整個頁面。
配置:使用 observerConfig,監聽整個 DOM 樹的節點變化。
3. 為什么使用 MutationObserver
知乎頁面是動態加載的,推薦卡片可能在頁面滾動或刷新時通過 JavaScript 插入 DOM。如果只在頁面加載時檢查(initialCheck),會漏掉后續加載的內容。MutationObserver 的優勢在于:
實時性:它能立即響應 DOM 變化,無需手動輪詢。
高效性:相比定時器(如 setInterval),它只在 DOM 實際變化時觸發,性能更好。
全面性:通過 subtree: true,可以監控整個頁面,包括深層嵌套的動態內容。
4. 腳本中 MutationObserver 的工作流程
初始化:
創建 MutationObserver 實例,定義當 DOM 變化時檢查新增節點的邏輯。
配置為監聽整個 DOM 樹的節點增刪。
啟動:
開始觀察 元素,監控頁面中任何新增節點。
處理變化:
當頁面加載新內容(例如滾動時插入新卡片),MutationObserver 檢測到 addedNodes。
對每個新增元素節點調用 checkNode,檢查是否匹配目標選擇器(div.KfeCollection-OrdinaryLabel-content 或 p.KfeCollection-IntroCard-contentName-newStyle-pc)和關鍵字(“鹽選專欄”或“鹽選”)。
如果匹配,找到祖先卡片(div.Card.TopstoryItem.TopstoryItem-isRecommend)并移除。
初始檢查補充:
由于 MutationObserver 只監聽變化,腳本還通過 window.addEventListener(‘load’, initialCheck) 檢查頁面加載時已存在的卡片。
5. 代碼中的優化點
節點類型檢查:腳本通過 node.nodeType === Node.ELEMENT_NODE 過濾非元素節點(如文本節點),提高效率。
選擇器檢查:checkNode 使用 matches 和 querySelectorAll,確保只處理符合條件的元素。
去重邏輯:通過 hideCard 函數統一卡片移除邏輯,避免重復代碼。
6. 可能的改進
性能優化:如果頁面變化頻繁,可以限制觀察范圍(例如只觀察某個容器如 div.Topstory-container),減少不必要的檢查。
斷開觀察:在某些場景下(例如頁面切換),可以通過 observer.disconnect() 停止觀察以釋放資源。
錯誤處理:添加 try-catch 塊處理 DOM 操作中的潛在異常。
7. 總結
MutationObserver 在腳本中用于實時監控知乎頁面中的 DOM 變化,捕獲動態加載的推薦卡片,并檢查是否包含“鹽選”相關內容。通過配置 childList 和 subtree,它能高效地覆蓋整個頁面,確保新插入的卡片被及時處理。結合初始檢查,腳本實現了對靜態和動態內容的全面覆蓋,完美適配知乎的動態加載場景。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79610.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79610.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79610.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何防止接口被刷

目錄 🛡? 一、常見的防刷策略分類 🔧 二、技術實現細節 ? 1. 基于 IP 限流 ? 2. 給接口加驗證碼 ? 3. 使用 Token 限制接口訪問權限 ? 4. 給接口加冷卻時間(驗證碼類經典) ? 5. 使用滑動窗口限流算法(更精…

github 項目遷移到 gitee

1. 查看遠程倉庫地址 git remote -v 2. 修改遠程倉庫地址 確保 origin 指向你的 Gitee 倉庫,如果不是,修改遠程地址。 git remote set-url origin https://gitee.com/***/project.git 3. 查看本地分支 git branch 4. 推送所有本地分支 git p…

探索大語言模型(LLM):目標、原理、挑戰與解決方案

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言語言模型的目標語言模型的數學表示語言模型面臨的挑戰解決參數量巨大的方法1. 馬爾可夫假設2. 神經網絡語言模型3.自監督學習4. 分布式表示 腦圖總結 前言 在自…

Kubernetes》》k8s》》Namespace

Namespace 概述 Namespace(命名空間) 是 Kubernetes 中用于邏輯隔離集群資源的機制,可將同一集群劃分為多個虛擬環境,適用于多團隊、多項目或多環境(如開發、測試、生產)的場景。 核心作用: 資…

FFUF指南

ffuf 的核心功能: 目錄/文件發現: 通過暴力破解(使用字典)探測目標網站的隱藏目錄或文件,例如: ffuf -w /path/to/wordlist.txt -u http://target.com/FUZZ 子域名枚舉: 通過模糊測試發現目標…

Qt通過ODBC和QPSQL兩種方式連接PostgreSQL或PolarDB PostgreSQL版

一、概述 以下主要在Windows下驗證連接PolarDB PostgreSQL版(阿里云兼容 PostgreSQL的PolarDB版本)。Linux下類似,ODBC方式則需要配置odbcinst.ini和odbc.ini。 二、代碼 以下為完整代碼,包含兩種方式連接數據庫,并…

為什么浮點數會搞出Infinity和NAN兩種類型?浮點數的底層原理?IEEE 754標準揭秘?

目錄 什么是NAN? 不同編程語言的NaN 為什么浮點數會搞出Infinity和NAN兩種類型? 浮點數 小數點位置浮動的原因 浮點數和整數 浮點數指令 精確性 浮點數的類型 為什么叫浮點數? 小數點位置浮動的原因 IEEE 754起源于intel公司 IEEE 754標準 編程語言的浮點數都…

Node.js Session 原理簡單介紹 + 示例代碼

目錄 ? Session 原理簡要說明 🧩 示例項目 - 使用 Node.js Express 實現簡單 Session 登錄 📁 文件結構 🔹 server.js (JavaScript) 🔸 index.html (HTML) ?? 程序運行步驟 ? 程序運行效果 🎯 總結 在 We…

實戰交易策略 篇十六:獵豹阿杜打板交易策略

文章目錄 系列文章狙擊漲停板的十大要訣炒股大成者,必具“三商”系列文章 實戰交易策略 篇一:奧利弗瓦萊士短線交易策略 實戰交易策略 篇二:杰西利弗莫爾股票大作手操盤術策略 實戰交易策略 篇三:333交易策略 實戰交易策略 篇四:價值投資交易策略 實戰交易策略 篇五:底部…

Opentelemetry 項目解讀

Opentelemetry 解讀 1. 什么是 Opentelmetry Ot 統一了可觀測的三個重要維度:分別是 Trace,Log,Metrics。 在沒有 ot 之前,不同維度的可觀測組件都是不同的: 在 Trace 領域:skywalking 一直很受歡迎&am…

與終端同居日記:Linux指令の進階撩撥手冊

前情提要: 當你和終端的關系從「早安打卡」進階到「深夜代碼同居」,那些曾經高冷的指令開始展露致命の反差萌—— man 是那個永遠在線的鋼鐵直男說明書,只會說:"想懂我?自己看文檔!"&#xff08…

Java 開發玩轉 MCP:從 Claude 自動化到 Spring AI Alibaba 生態整合

摘要 本文以原理與示例結合的形式講解 Java 開發者如何基于 Spring AI Alibaba 框架玩轉 MCP,主要包含以下內容。 1. 一些 MCP 基礎與快速體驗(熟悉的讀者可以跳過此部分) 2. 如何將自己開發的 Spring 應用發布為 MCP Server,驗…

【面試向】欠擬合和過擬合、正則化(Regularization)

訓練集、驗證集和測試集泛化誤差過擬合(Overfitting)和 欠擬合(Underfitting)如何區分過擬合和欠擬合?欠擬合 —— 在訓練集和驗證集上都表現很差過擬合 —— 在訓練集上表現很好,但在驗證集或測試集上表現…

ClawCloud的免費空間(github用戶登錄可以獲得$5元/月的免費額度)

免費的空間 Welcome to ClawCloud Lets create your workspace 官網:ClawCloud | Cloud Infrastructure And Platform for Developers 區域選擇新加坡 然后這個頁面會變成新加坡區域,再按一次確定,就創建好了工作臺。 初始界面&#xff0…

Spring Boot + Caffeine:打造高性能緩存解決方案

1. 引言 1.1 緩存的重要性 緩存是提升系統性能的關鍵技術之一,通過將頻繁訪問的數據存儲在內存中,減少對數據庫或其他外部系統的訪問次數,從而降低延遲并提高吞吐量。 緩存的基本概念:緩存是一種臨時存儲機制,用于快速訪問常用數據。緩存在提升系統性能中的作用:減少數…

每天學一個 Linux 命令(24):chattr

??可訪問網站查看,視覺品味拉滿: http://www.616vip.cn/24/index.html 每天學一個 Linux 命令(24):chattr 命令簡介 chattr(Change Attribute)用于修改文件或目錄的底層屬性(如防刪除、防修改),這些屬性比普通權限更嚴格。常用于保護重要文件或優化文件系統行為。…

【java 13天進階Day04】常用API、正則表達式,泛型、Collection集合API

Math類的使用。 Math用于做數學運算。Math類中的方法全部是靜態方法,直接用類名調用即可。方法: public static int abs(int a) 獲取參數a的絕對值public static double ceil(double a) 向上取整public static double floor(double a) 向下取整public s…

如何系統地入門學習stm32?

如何系統地入門學習stm32? 作為一個在嵌入式領域摸爬滾打十余年的工程師,看到這個問題,我不禁想起自己當年啃著厚重的數據手冊,對著一塊藍色的PCB板冥思苦想的日子。STM32的學習之路,說難不算特別難,說簡單…

考公:數字推理

文章目錄 1.真題12 312 530 756 ()-3 3 1 12 17 ()356 342 333 324 ()30 28 27 25 () 2215105 1494 1383 1272 ()2 3 8 21 46 ()4/25 1/4 4/9 1 ()39 416 630 848 ()5 8 11 17 () 10714 21 40 77 () 229 2.數字推理方法2.1 差值法2.2 比值法(乘法關系)2.…

自動化測試相關協議深度剖析及A2A、MCP協議自動化測試應用展望

一、不同協議底層邏輯關聯分析 1. OPENAPI協議 OPENAPI 協議核心在于定義 API 的規范結構,它使用 YAML 或 JSON 格式來描述 API 的端點、請求參數、響應格式等信息。其底層邏輯是構建一個清晰、標準化的 API 描述文檔,方便不同的客戶端和服務端進行對接…