您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Change webpage content
当前为
// ==UserScript== // @name MonkeyModifier // @namespace https://github.com/JiyuShao/greasyfork-scripts // @version 2024-07-29 // @description Change webpage content // @author Jiyu Shao <[email protected]> // @license MIT // @match *://*/* // @run-at document-start // @grant unsafeWindow // ==/UserScript== (function () { 'use strict'; // ################### common tools function replaceTextInNode(node, originalText, replaceText) { // 如果当前节点是文本节点并且包含 originalText if (node instanceof Text && node.textContent.includes(originalText)) { // 替换文本 node.textContent = node.textContent.replace(originalText, replaceText); } // 如果当前节点有子节点,递归处理每个子节点 if (node.hasChildNodes()) { node.childNodes.forEach((child) => { replaceTextInNode(child, originalText, replaceText); }); } } function registerMutationObserver(node, config = {}, options = {}) { const finalConfig = { attributes: false, childList: true, subtree: true, ...config, }; const finalOptions = { // 元素的属性发生了变化 attributes: options.attributes || [], // 子节点列表发生了变化 childList: { addedNodes: options.childList.addedNodes || [ // { // filter: (node) => {}, // action: (node) => {}, // } ], removedNodes: options.childList.removedNodes || [], }, // 文本节点的内容发生了变化 characterData: options.characterData || [], }; const observer = new MutationObserver((mutationsList, _observer) => { mutationsList.forEach((mutation) => { if (mutation.type === 'attributes') { finalOptions.attributes.forEach(({ filter, action }) => { try { if (filter(mutation.target, mutation)) { action(mutation.target, mutation); } } catch (error) { console.error( 'MutationObserver attributes callback failed:', mutation.target, error ); } }); } if (mutation.type === 'childList') { // 检查是否有新增的元素 mutation.addedNodes.forEach((node) => { finalOptions.childList.addedNodes.forEach(({ filter, action }) => { try { if (filter(node, mutation)) { action(node, mutation); } } catch (error) { console.error( 'MutationObserver childList.addedNodes callback failed:', node, error ); } }); }); // 检查是否有删除元素 mutation.removedNodes.forEach((node) => { finalOptions.childList.removedNodes.forEach((filter, action) => { try { if (filter(node, mutation)) { action(node, mutation); } } catch (error) { console.error( 'MutationObserver childList.removedNodes callback failed:', node, error ); } }); }); } if (mutation.type === 'characterData') { finalOptions.characterData.forEach(({ filter, action }) => { try { if (filter(mutation.target, mutation)) { action(mutation.target, mutation); } } catch (error) { console.error( 'MutationObserver characterData callback failed:', mutation.target, error ); } }); } }); }); observer.observe(node, finalConfig); return observer; } // ################### 加载前插入样式覆盖 const style = document.createElement('style'); const cssRules = ` .dropdown-submenu--viewmode { display: none !important; } [field=modified] { display: none !important; } [data-value=modified] { display: none !important; } [data-value=lastmodify] { display: none !important; } [data-grid-field=modified] { display: none !important; } [data-field-key=modified] { display: none !important; } #Revisions { display: none !important; } #ContentModified { display: none !important; } [title="最后修改时间"] { display: none !important; } `; style.appendChild(document.createTextNode(cssRules)); unsafeWindow.document.head.appendChild(style); // ################### 网页内容加载完成立即执行脚本 unsafeWindow.addEventListener('DOMContentLoaded', function () { // 监听任务右侧基本信息 const taskRightInfoEles = unsafeWindow.document.querySelectorAll('#ContentModified'); taskRightInfoEles.forEach((element) => { const parentDiv = element.closest('div.left_3_col'); if (parentDiv) { parentDiv.style.display = 'none'; } }); }); // ################### 加载完成动态监听 unsafeWindow.addEventListener('load', function () { registerMutationObserver( unsafeWindow.document.body, { attributes: false, childList: true, subtree: true, }, { childList: { addedNodes: [ // 动态文本替换问题 { filter: (node, _mutation) => { return node.textContent.includes('最后修改时间'); }, action: (node, _mutation) => { replaceTextInNode(node, '最后修改时间', '迭代修改时间'); }, }, // 监听动态弹窗 隐藏设置列表字段-最后修改时间左侧 { filter: (node, _mutation) => { return ( node.querySelectorAll && node.querySelectorAll('input[value=modified]').length > 0 ); }, action: (node, _mutation) => { node .querySelectorAll('input[value=modified]') .forEach((ele) => { const parentDiv = ele.closest('div.field'); if (parentDiv) { parentDiv.style.display = 'none'; } }); }, }, // 监听动态弹窗 隐藏设置列表字段-最后修改时间右侧 { filter: (node, _mutation) => { return ( node.querySelectorAll && node.querySelectorAll('span[title=最后修改时间]').length > 0 ); }, action: (node, _mutation) => { node .querySelectorAll('span[title=最后修改时间]') .forEach((ele) => { const parentDiv = ele.closest('div[role=treeitem]'); if (parentDiv) { parentDiv.style.display = 'none'; } }); }, }, ], }, } ); }); })();