Greasy Fork is available in English.
知乎工具箱,各种奇奇怪怪的小功能~
// ==UserScript==
// @name 知乎工具箱
// @namespace http://tampermonkey.net/
// @version 0.1.3
// @description 知乎工具箱,各种奇奇怪怪的小功能~
// @author kuubee
// @match https://*.zhihu.com/*
// @icon https://www.google.com/s2/favicons?domain=mozilla.org
// @grant none
// @noframes
// ==/UserScript==
const ZHI_HU_BLUE = "#06f";
(function () {
"use strict";
window.onload = () => {
if (window.firstFlag) return;
window.firstFlag = true;
ZhihuUtils.aJumpOptimization();
ZhihuUtils.answerListInit();
};
})();
class ZhihuUtils {
// a 标签跳转优化
static aJumpOptimization() {
window.addEventListener("click", (e) => {
if (e.target.tagName !== "A") return;
const href = e.target.href;
const matchList = href.match(
/https?:\/\/link\.zhihu\.com\/\?target=(.*)/
);
if (!matchList) return;
if (!matchList[0]) return;
if (!matchList[1]) return;
const targetHref = decodeURIComponent(matchList[1]);
e.preventDefault();
window.open(targetHref);
});
}
// 初始化问答列表
static answerListInit() {
// 旧的列表长度
let oldListLenght = 0;
/**
* @param {HTMLElement} rootEle 根列表元素
*/
const init = (rootEle) => {
const listItemDom = Array.from(
rootEle.querySelectorAll(
".Card.TopstoryItem.TopstoryItem--old.TopstoryItem-isRecommend"
)
);
if (listItemDom.length <= 0) {
oldListLenght = 0;
return console.log("无数据");
}
if (listItemDom.length === oldListLenght) return console.log("数量未变");
console.log("数量改变,重新计算", oldListLenght, listItemDom.length);
// 只处理新增的数据
listItemDom.slice(oldListLenght, listItemDom.length).forEach((item) => {
const firstChild = item.children[0];
const cardInfo = JSON.parse(firstChild.dataset?.zaExtraModule ?? "{}");
if (
Object.keys(cardInfo).length <= 0 ||
item.className === "Pc-feedAd-container "
)
return ZhihuUtils.hiddenAD(item);
if (cardInfo?.card?.has_video)
return ZhihuUtils.hiddenVidelAnswer(firstChild);
});
oldListLenght = listItemDom.length;
};
const listRootDom = document.querySelector("#TopstoryContent");
const listRootDomObs = new MutationObserver(() => init(listRootDom));
listRootDomObs.observe(listRootDom, {
attributes: false,
childList: true,
subtree: true
});
init(listRootDom);
}
/**
* @param {HTMLElement} ele 对应的元素
*/
static hiddenAD(ele) {
console.log("这个card 是一个广告");
ele.style.display = "none";
}
/**
* @param {HTMLElement} ele 对应的元素
*/
static hiddenVidelAnswer(ele) {
console.log("这是一个视频回答");
// 标题 dom
const titleDom = ele.querySelector(".ContentItem-title");
const titleInnterDom =
titleDom.querySelector("div") ?? titleDom.querySelector("a");
// 视频 dom
const videoDom =
ele.querySelector(".VideoAnswerPlayer") ??
ele.querySelector(".ZVideoItem-video");
if (videoDom) videoDom.style.display = "none";
// 创建 tag dom
const tagDom = document.createElement("div");
// 调整样式
// tag 样式
/** @type {CSSStyleDeclaration} **/
const tagStyleObj = {
border: `2px solid ${ZHI_HU_BLUE}`,
borderRadius: "10px",
padding: "2px 0",
fontWeight: "400",
textAlign: "center",
minWidth: "80px",
background: "#fff",
boxSizing: "border-box",
color: ZHI_HU_BLUE,
fontSize: "12px",
marginRight: "10px",
userSelect: "none"
};
for (const key in tagStyleObj) {
if (Object.hasOwnProperty.call(tagStyleObj, key)) {
const element = tagStyleObj[key];
tagDom.style[key] = element;
}
}
// title 样式
titleDom.style.display = "flex";
titleDom.style.alignItems = "center";
titleDom.style.marginBottom = "10px";
// 插入元素
tagDom.innerText = "视频回答";
titleDom.insertBefore(tagDom, titleInnterDom);
}
}