Greasy Fork is available in English.

美化知乎打印

在打印知乎文章网页时,或者另存为pdf时,有很多干扰元素占面积,这个脚本能删除这些干扰元素。但是右侧的分享等按钮是滚动才出现,所以不能立马删除。

// ==UserScript==
// @name         美化知乎打印
// @namespace    http://tampermonkey.net/
// @version      2024-03-20
// @description  在打印知乎文章网页时,或者另存为pdf时,有很多干扰元素占面积,这个脚本能删除这些干扰元素。但是右侧的分享等按钮是滚动才出现,所以不能立马删除。
// @author       Tajang
// @match        https://zhuanlan.zhihu.com/p/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=zhihu.com
// @grant        none
// @license      GPL-3.0
// ==/UserScript==

window.onload = function () {
	"use strict";
	//删除头部横幅
	// 执行 XPath 查询以选择要删除的元素
	let xpathResult = document.evaluate(
		'//*[@id="root"]/div/main/div/div[1]/div/div[1]',
		document,
		null,
		XPathResult.FIRST_ORDERED_NODE_TYPE,
		null
	);

	// 获取查询结果中的第一个节点
	let buttonToRemove = xpathResult.singleNodeValue;

	// 检查按钮元素是否存在
	if (buttonToRemove) {
		// 从父元素中移除按钮元素
		buttonToRemove.parentNode.removeChild(buttonToRemove);
		console.log("头部横幅已删除");
	} else {
		console.log("头部横幅元素找不到");
	}

	//删除底部功能栏
	// 执行 XPath 查询以选择要删除的元素
	let botbar = document.evaluate(
		'//*[@id="root"]/div/main/div/article/div[4]/div[1]/div[1]',
		document,
		null,
		XPathResult.FIRST_ORDERED_NODE_TYPE,
		null
	);

	// 获取查询结果中的第一个节点
	let buttonToRemove2 = botbar.singleNodeValue;

	// 检查按钮元素是否存在
	if (buttonToRemove2) {
		// 从父元素中移除按钮元素
		buttonToRemove2.parentNode.removeChild(buttonToRemove2);
		console.log("底部功能栏已删除");
	} else {
		console.log("底部功能栏找不到");
	}

	//删除关注按钮
	// 执行 XPath 查询以选择要删除的元素
	let gzbar = document.evaluate(
		'//*[@id="root"]/div/main/div/article/header/div[1]/button',
		document,
		null,
		XPathResult.FIRST_ORDERED_NODE_TYPE,
		null
	);

	// 获取查询结果中的第一个节点
	let buttonToRemove7 = gzbar.singleNodeValue;

	// 检查按钮元素是否存在
	if (buttonToRemove7) {
		// 从父元素中移除按钮元素
		buttonToRemove7.parentNode.removeChild(buttonToRemove7);
		console.log("关注按钮已删除");
	} else {
		console.log("关注按钮找不到");
	}
	//删除赞同人数
	// 执行 XPath 查询以选择要删除的元素
	let zanbar = document.evaluate(
		'//*[@id="root"]/div/main/div/article/header/div[3]',
		document,
		null,
		XPathResult.FIRST_ORDERED_NODE_TYPE,
		null
	);

	// 获取查询结果中的第一个节点
	let buttonToRemove3 = zanbar.singleNodeValue;

	// 检查按钮元素是否存在
	if (buttonToRemove3) {
		// 从父元素中移除按钮元素
		buttonToRemove3.parentNode.removeChild(buttonToRemove3);
		console.log("赞同人数栏已删除");
	} else {
		console.log("赞同人数栏找不到");
	}

	//删除回到顶部按钮
	// 执行 XPath 查询以选择要删除的元素
	let hdbar = document.evaluate(
		'//*[@id="root"]/div/div[3]/div/div/button',
		document,
		null,
		XPathResult.FIRST_ORDERED_NODE_TYPE,
		null
	);

	// 获取查询结果中的第一个节点
	let buttonToRemove4 = hdbar.singleNodeValue;

	// 检查按钮元素是否存在
	if (buttonToRemove4) {
		// 从父元素中移除按钮元素
		buttonToRemove4.parentNode.removeChild(buttonToRemove4);
		console.log("回到顶部按钮已删除");
	} else {
		console.log("回到顶部按钮找不到");
	}
	//删除右侧赞同按钮
	// 等待元素出现的函数
	function waitForElement(xpath, callback) {
		const element = document.evaluate(
			xpath,
			document,
			null,
			XPathResult.FIRST_ORDERED_NODE_TYPE,
			null
		).singleNodeValue;

		if (element) {
			// 如果找到元素,执行回调函数
			callback(element);
		} else {
			// 如果未找到元素,延迟一段时间后再次尝试
			setTimeout(function () {
				waitForElement(xpath, callback);
			}, 1000); // 每隔1秒重新尝试一次
		}
	}

	// 调用 waitForElement 函数,传入元素的 XPath 和删除元素的操作
	waitForElement(
		'//*[@id="root"]/div/main/div/article/div[4]/div[1]/div/button',
		function (element) {
			// 删除找到的元素
			element.parentNode.removeChild(element);
			console.log("元素已删除");
		}
	);

	//删除右侧分享按钮
	function waitForElement2(xpath, callback) {
		const element = document.evaluate(
			xpath,
			document,
			null,
			XPathResult.FIRST_ORDERED_NODE_TYPE,
			null
		).singleNodeValue;
		if (element) {
			// 如果找到元素,执行回调函数
			callback(element);
		} else {
			// 如果未找到元素,延迟一段时间后再次尝试
			setTimeout(function () {
				waitForElement2(xpath, callback);
			}, 1000); // 每隔1秒重新尝试一次
		}
	}

	// 调用 waitForElement 函数,传入元素的 XPath 和删除元素的操作
	waitForElement2(
		'//*[@id="root"]/div/main/div/article/div[4]/div[1]/div/div',
		function (element) {
			// 删除找到的元素
			element.parentNode.removeChild(element);
			console.log("元素已删除");
		}
	);

	//删除底部栏
	// 执行 XPath 查询以选择要删除的元素
	let footbar = document.evaluate(
		'//*[@id="root"]/div/main/div/div[2]',
		document,
		null,
		XPathResult.FIRST_ORDERED_NODE_TYPE,
		null
	);

	// 获取查询结果中的第一个节点
	let buttonToRemove8 = footbar.singleNodeValue;

	// 检查按钮元素是否存在
	if (buttonToRemove8) {
		// 从父元素中移除按钮元素
		buttonToRemove8.parentNode.removeChild(buttonToRemove8);
		console.log("底部已删除");
	} else {
		console.log("底部找不到");
	}
};