Greasy Fork

Greasy Fork is available in English.

上班快乐刷知乎

可隐藏知乎首页的列表图片和展开的内容图片,极大程度被发现上班在划水刷知乎。快捷键(双击H、双击G)

目前为 2023-10-09 提交的版本。查看 最新版本

// ==UserScript==
// @name         上班快乐刷知乎
// @namespace    http://tampermonkey.net/
// @version      0.1.2
// @description  可隐藏知乎首页的列表图片和展开的内容图片,极大程度被发现上班在划水刷知乎。快捷键(双击H、双击G)
// @author       You
// @match        https://www.zhihu.com/
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// ==/UserScript==

;(function () {
  'use strict'

  const getBool = val => {
    if (val === null) return true
    if (val === 'true') return true
    if (val === 'false') return false
    return true
  }

  // 外层图片
  const localIfShowOuterImg = localStorage.getItem('ifShowOuterImg')
  var ifShowOuterImg = getBool(localIfShowOuterImg)

  // 内层富文本图片
  const localIfShowInnerImg = localStorage.getItem('ifShowInnerImg')
  var ifShowInnerImg = getBool(localIfShowInnerImg)

  /** --------------------- 添加图片控制事件 --------------------- */
  function handleImgBox(ele, ifShowOuterImg) {
    const imgParentLists = document.querySelectorAll(ele)
    imgParentLists.forEach(item => {
      item.style.display = ifShowOuterImg ? 'block' : 'none'
    })
  }

  // 外层
  var outerImg = status => handleImgBox('.RichContent-cover', status)
  var updateOuterImg = status => {
    ifShowOuterImg = status
    localStorage.setItem('ifShowOuterImg', status)
    outerImg(status)

    const btn = document.getElementById('outer-btn')
    btn.style.opacity = status ? 1 : 0.5
  }

  // 内层
  var innerImg = status => handleImgBox('.RichContent-inner img', status)
  var updateInnerImg = status => {
    ifShowInnerImg = status
    localStorage.setItem('ifShowInnerImg', status)
    innerImg(status)

    const btn = document.getElementById('inner-btn')
    btn.style.opacity = status ? 1 : 0.5
  }

  if (ifShowOuterImg === false) setTimeout(() => updateOuterImg(false))
  if (ifShowInnerImg === false) setTimeout(() => updateInnerImg(false))
  /** --------------------- 添加图片控制事件 --------------------- */

  /** --------------------- 页面新增按钮 --------------------- */
  function addEle({ tag, id, text, style, callback }) {
    var element = document.createElement(tag)
    element.id = id
    element.innerText = text
    element.style.cssText = style

    if (callback) {
      element.addEventListener('click', callback)
    }

    document.body.appendChild(element)
  }

  const listBtnStyle = `
          position: fixed;
          bottom: 16%;
          right: 15px;
          border-radius: 50px;
          // width: 80px;
          height: 35px;
          background: #056De8;
          color: #fff;
          padding: 0 10px;
        `

  const richTextBtnStyle = `
        position: fixed;
        bottom: 10%;
        right: 15px;
        border-radius: 50px;
        // width: 80px;
        height: 35px;
        background: #056De8;
        color: #fff;
        padding: 0 10px;
      `

  addEle({
    id: 'outer-btn',
    tag: 'button',
    text: '列表图片',
    style: listBtnStyle,
    callback: () => {
      updateOuterImg(!ifShowOuterImg)
    }
  })

  addEle({
    id: 'inner-btn',
    tag: 'button',
    text: '富文本图片',
    style: richTextBtnStyle,
    callback: () => {
      updateInnerImg(!ifShowInnerImg)
    }
  })
  /** --------------------- 页面新增按钮 --------------------- */

  // /** --------------------- 双击事件 --------------------- */
  function addListener(key, callback) {
    var keyPressCount = 0
    var keyPressTimeout

    document.addEventListener('keydown', function (event) {
      if (event.key.toLowerCase() === key.toLowerCase()) {
        keyPressCount++

        if (keyPressCount === 1) {
          keyPressTimeout = setTimeout(function () {
            keyPressCount = 0
          }, 300) // 设置延迟时间,可以根据需要调整
        } else if (keyPressCount === 2) {
          clearTimeout(keyPressTimeout)
          callback()
          keyPressCount = 0
        }
      }
    })
  }

  addListener('H', () => {
    updateOuterImg(!ifShowOuterImg)
  })

  addListener('G', () => {
    updateInnerImg(!ifShowInnerImg)
  })

  // /** --------------------- 双击事件 --------------------- */

  /** --------------------- 监听列表变化  --------------------- */
  // 目标元素的选择器
  var targetSelector = '.css-1fsnuue'

  // 创建一个 MutationObserver 实例
  var observer = new MutationObserver(function (mutationsList) {
    for (var mutation of mutationsList) {
      if (mutation.type === 'childList') {
        // 检查是否有新的子节点添加或移除
        var targetElement = mutation.target
        var childNodes = targetElement.querySelectorAll(':scope > *')
        var length = childNodes.length

        // 执行你的处理逻辑

        // 外层
        outerImg(ifShowOuterImg)

        // 内层
        innerImg(ifShowInnerImg)
      }
    }
  })

  // 配置 MutationObserver 监听的选项
  var observerOptions = {
    childList: true, // 监听子节点的变化
    subtree: true // 监听所有后代节点的变化
  }

  // 获取目标元素
  var targetElement = document.querySelector(targetSelector)

  if (targetElement) {
    // 开始监听目标元素的变化
    observer.observe(targetElement, observerOptions)
  } else {
    console.log('目标元素不存在!')
  }
  /** --------------------- 监听列表变化  --------------------- */
})()