// ==UserScript== // @name 拼多多跨境(Temu)弹窗屏蔽 // @version 0.5.1 // @description 用于屏蔽拼多多跨境卖家平台的弹窗 // @author linying // @match *://kuajing.pinduoduo.com/* // @match *://seller.kuajingmaihuo.com/* // @match *://kuajingboss.com/* // @match *://agentseller.temu.com/* // @exclude */login* // @exclude */settle/site-main* // @exclude */questionnaire?surveyId=* // @exclude */settle/seller-login?redirectUrl=* // @exclude */agentseller*.temu.com/main/authentication?redirectUrl=* // @exclude */agentseller*.temu.com/mmsos/online-shipping-result.html* // @icon https://alist.linying.eu.org/d/d/Pictures/icon.svg // @supportURL https://github.com/linying23333 // @homepage https://github.com/linying23333 // @icon data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNzE2MzU2OTE5NTgzIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjM2NDkiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PHBhdGggZD0iTTg2MC4wNjg1NzEgNjY2LjQyMjg1N0w3MjYuODU3MTQzIDczMS4yNDU3MTRjLTguNjg1NzE0IDQuMjA1NzE0LTE4Ljc0Mjg1NyA0LjIwNTcxNC0yNy40Mjg1NzIgMGwtMTMzLjIxMTQyOC02NC44MjI4NTdBMzEuMjk2IDMxLjI5NiAwIDAgMSA1NDguNTcxNDI5IDYzOC4yNjI4NTdWNDc3LjE2NTcxNGMwLTExLjk3NzE0MyA2Ljg1NzE0My0yMi45NDg1NzEgMTcuNjQ1NzE0LTI4LjE2bDEzMy4yMTE0MjgtNjQuODIyODU3YzguNjg1NzE0LTQuMjA1NzE0IDE4Ljc0Mjg1Ny00LjIwNTcxNCAyNy40Mjg1NzIgMGwxMzMuMjExNDI4IDY0LjgyMjg1N2MxMC43ODg1NzEgNS4yMTE0MjkgMTcuNjQ1NzE0IDE2LjE4Mjg1NyAxNy42NDU3MTUgMjguMTZ2MTYxLjA5NzE0M2MwIDExLjk3NzE0My02Ljg1NzE0MyAyMi45NDg1NzEtMTcuNjQ1NzE1IDI4LjE2eiIgZmlsbD0iI0I0RDdGRSIgcC1pZD0iMzY1MCI+PC9wYXRoPjxwYXRoIGQ9Ik03MTMuMTQyODU3IDcwMS45ODg1NzFWNTQzLjU0Mjg1N2wtMTM5LjMzNzE0My02OC41NzE0MjhNODUyLjQ4IDQ3NC45NzE0MjlMNzEzLjE0Mjg1NyA1NDMuNTQyODU3IiBmaWxsPSIjQjREN0ZFIiBwLWlkPSIzNjUxIj48L3BhdGg+PHBhdGggZD0iTTk1MC44NTcxNDMgMTQ2LjI4NTcxNEg3My4xNDI4NTdjLTEwLjA1NzE0MyAwLTE4LjI4NTcxNCA4LjIyODU3MS0xOC4yODU3MTQgMTguMjg1NzE1djYyMS43MTQyODVjMCAxMC4wNTcxNDMgOC4yMjg1NzEgMTguMjg1NzE0IDE4LjI4NTcxNCAxOC4yODU3MTVoMjA1LjcxNDI4NnY1NC44NTcxNDJjMCAxMC4wNTcxNDMgOC4yMjg1NzEgMTguMjg1NzE0IDE4LjI4NTcxNCAxOC4yODU3MTVoNDI5LjcxNDI4NmMxMC4wNTcxNDMgMCAxOC4yODU3MTQtOC4yMjg1NzEgMTguMjg1NzE0LTE4LjI4NTcxNXYtNTQuODU3MTQySDk1MC44NTcxNDNjMTAuMDU3MTQzIDAgMTguMjg1NzE0LTguMjI4NTcxIDE4LjI4NTcxNC0xOC4yODU3MTVWMTY0LjU3MTQyOWMwLTEwLjA1NzE0My04LjIyODU3MS0xOC4yODU3MTQtMTguMjg1NzE0LTE4LjI4NTcxNXpNNzA4LjU3MTQyOSA4NDEuMTQyODU3aC0zOTMuMTQyODU4di0zNi41NzE0MjhoMzkzLjE0Mjg1OHYzNi41NzE0Mjh6IG0yMjQtNzMuMTQyODU3SDkxLjQyODU3MVYxODIuODU3MTQzaDg0MS4xNDI4NTh2NTg1LjE0Mjg1N3oiIGZpbGw9IiMyNDhCRkYiIHAtaWQ9IjM2NTIiPjwvcGF0aD48cGF0aCBkPSJNMTgyLjg1NzE0MyAyNzQuMjg1NzE0aDIwMS4xNDI4NTd2MzYuNTcxNDI5SDE4Mi44NTcxNDN6IiBmaWxsPSIjQjREN0ZFIiBwLWlkPSIzNjUzIj48L3BhdGg+PHBhdGggZD0iTTQxMS40Mjg1NzEgMjM3LjcxNDI4NkgxNTUuNDI4NTcxYy01LjAyODU3MSAwLTkuMTQyODU3IDQuMTE0Mjg2LTkuMTQyODU3IDkuMTQyODU3djQ1Ny4xNDI4NTdjMCA1LjAyODU3MSA0LjExNDI4NiA5LjE0Mjg1NyA5LjE0Mjg1NyA5LjE0Mjg1N2gyNTZjNS4wMjg1NzEgMCA5LjE0Mjg1Ny00LjExNDI4NiA5LjE0Mjg1OC05LjE0Mjg1N1YyNDYuODU3MTQzYzAtNS4wMjg1NzEtNC4xMTQyODYtOS4xNDI4NTctOS4xNDI4NTgtOS4xNDI4NTd6IG0tMjI4LjU3MTQyOCAzNi41NzE0MjhoMjAxLjE0Mjg1N3YzNi41NzE0MjlIMTgyLjg1NzE0M3YtMzYuNTcxNDI5eiBtMCA0MDIuMjg1NzE1VjM0Ny40Mjg1NzFoMjAxLjE0Mjg1N3YzMjkuMTQyODU4SDE4Mi44NTcxNDN6TTg2Ny40NzQyODYgNDUyLjU3MTQyOWwtMTQ2LjI4NTcxNS03MS4yMjI4NThjLTIuNTYtMS4xODg1NzEtNS4zMDI4NTctMS44Mjg1NzEtOC4wNDU3MTQtMS44Mjg1NzFzLTUuNDg1NzE0IDAuNjQtOC4wNDU3MTQgMS44Mjg1NzFsLTE0Ni4yODU3MTQgNzEuMjIyODU4Yy02LjIxNzE0MyAzLjEwODU3MS0xMC4yNCA5LjQxNzE0My0xMC4yNCAxNi40NTcxNDJ2MTc3LjM3MTQyOWMwIDcuMDQgNC4wMjI4NTcgMTMuMzQ4NTcxIDEwLjI0IDE2LjQ1NzE0M2wxNDYuMjg1NzE0IDcxLjIyMjg1N2MyLjU2IDEuMTg4NTcxIDUuMzAyODU3IDEuODI4NTcxIDguMDQ1NzE0IDEuODI4NTcxczUuNDg1NzE0LTAuNjQgOC4wNDU3MTQtMS44Mjg1NzFsMTQ2LjI4NTcxNS03MS4yMjI4NTdjNi4zMDg1NzEtMy4wMTcxNDMgMTAuMjQtOS40MTcxNDMgMTAuMjQtMTYuNDU3MTQzVjQ2OS4wMjg1NzFjMC03LjA0LTQuMDIyODU3LTEzLjM0ODU3MS0xMC4yNC0xNi40NTcxNDJ6TTcxMy4xNDI4NTcgNDE4LjEwMjg1N2wxMDcuMjQ1NzE0IDUyLjIwNTcxNC0xMDcuNDI4NTcxIDUyLjkzNzE0M2MtMC42NC0wLjM2NTcxNC0xLjI4LTAuODIyODU3LTEuOTItMS4wOTcxNDNsLTEwNS4xNDI4NTctNTEuNzQ4NTcxTDcxMy4xNDI4NTcgNDE4LjEwMjg1N3ogbS0xMjggODIuODM0Mjg2bDEwOS43MTQyODYgNTQuMDM0Mjg2djEzMy4zOTQyODVsLTEwOS43MTQyODYtNTMuMzk0Mjg1VjUwMC45MzcxNDN6IG0xNDYuMjg1NzE0IDE4Ny40Mjg1NzFWNTU0Ljk3MTQyOWwxMDkuNzE0Mjg2LTU0LjAzNDI4NnYxMzQuMDM0Mjg2bC0xMDkuNzE0Mjg2IDUzLjM5NDI4NXoiIGZpbGw9IiMyNDhCRkYiIHAtaWQ9IjM2NTQiPjwvcGF0aD48cGF0aCBkPSJNMzQ3LjQyODU3MSA0MTEuNDI4NTcxSDIxOS40Mjg1NzFjLTEwLjA1NzE0MyAwLTE4LjI4NTcxNC04LjIyODU3MS0xOC4yODU3MTQtMTguMjg1NzE0czguMjI4NTcxLTE4LjI4NTcxNCAxOC4yODU3MTQtMTguMjg1NzE0aDEyOGMxMC4wNTcxNDMgMCAxOC4yODU3MTQgOC4yMjg1NzEgMTguMjg1NzE1IDE4LjI4NTcxNHMtOC4yMjg1NzEgMTguMjg1NzE0LTE4LjI4NTcxNSAxOC4yODU3MTR6TTg1OS40Mjg1NzEgMjkyLjU3MTQyOUg0ODQuNTcxNDI5Yy0xMC4wNTcxNDMgMC0xOC4yODU3MTQtOC4yMjg1NzEtMTguMjg1NzE1LTE4LjI4NTcxNXM4LjIyODU3MS0xOC4yODU3MTQgMTguMjg1NzE1LTE4LjI4NTcxNGgzNzQuODU3MTQyYzEwLjA1NzE0MyAwIDE4LjI4NTcxNCA4LjIyODU3MSAxOC4yODU3MTUgMTguMjg1NzE0cy04LjIyODU3MSAxOC4yODU3MTQtMTguMjg1NzE1IDE4LjI4NTcxNXpNNjY3LjQyODU3MSAzNTYuNTcxNDI5SDQ4NC41NzE0MjljLTEwLjA1NzE0MyAwLTE4LjI4NTcxNC04LjIyODU3MS0xOC4yODU3MTUtMTguMjg1NzE1czguMjI4NTcxLTE4LjI4NTcxNCAxOC4yODU3MTUtMTguMjg1NzE0aDE4Mi44NTcxNDJjMTAuMDU3MTQzIDAgMTguMjg1NzE0IDguMjI4NTcxIDE4LjI4NTcxNSAxOC4yODU3MTRzLTguMjI4NTcxIDE4LjI4NTcxNC0xOC4yODU3MTUgMTguMjg1NzE1ek01NDguNTcxNDI5IDQyMC41NzE0MjloLTY0Yy0xMC4wNTcxNDMgMC0xOC4yODU3MTQtOC4yMjg1NzEtMTguMjg1NzE1LTE4LjI4NTcxNXM4LjIyODU3MS0xOC4yODU3MTQgMTguMjg1NzE1LTE4LjI4NTcxNGg2NGMxMC4wNTcxNDMgMCAxOC4yODU3MTQgOC4yMjg1NzEgMTguMjg1NzE0IDE4LjI4NTcxNHMtOC4yMjg1NzEgMTguMjg1NzE0LTE4LjI4NTcxNCAxOC4yODU3MTV6TTIzNy43MTQyODYgNDc1LjQyODU3MWgtMTguMjg1NzE1Yy0xMC4wNTcxNDMgMC0xOC4yODU3MTQtOC4yMjg1NzEtMTguMjg1NzE0LTE4LjI4NTcxNHM4LjIyODU3MS0xOC4yODU3MTQgMTguMjg1NzE0LTE4LjI4NTcxNGgxOC4yODU3MTVjMTAuMDU3MTQzIDAgMTguMjg1NzE0IDguMjI4NTcxIDE4LjI4NTcxNCAxOC4yODU3MTRzLTguMjI4NTcxIDE4LjI4NTcxNC0xOC4yODU3MTQgMTguMjg1NzE0eiIgZmlsbD0iIzI0OEJGRiIgcC1pZD0iMzY1NSI+PC9wYXRoPjxwYXRoIGQ9Ik0zMDEuNzE0Mjg2IDUzOS40Mjg1NzFoLTgyLjI4NTcxNWMtMTAuMDU3MTQzIDAtMTguMjg1NzE0LTguMjI4NTcxLTE4LjI4NTcxNC0xOC4yODU3MTRzOC4yMjg1NzEtMTguMjg1NzE0IDE4LjI4NTcxNC0xOC4yODU3MTRoODIuMjg1NzE1YzEwLjA1NzE0MyAwIDE4LjI4NTcxNCA4LjIyODU3MSAxOC4yODU3MTQgMTguMjg1NzE0cy04LjIyODU3MSAxOC4yODU3MTQtMTguMjg1NzE0IDE4LjI4NTcxNHoiIGZpbGw9IiMyNDhCRkYiIHAtaWQ9IjM2NTYiPjwvcGF0aD48cGF0aCBkPSJNMjc0LjI4NTcxNCA2MDMuNDI4NTcxaC01NC44NTcxNDNjLTEwLjA1NzE0MyAwLTE4LjI4NTcxNC04LjIyODU3MS0xOC4yODU3MTQtMTguMjg1NzE0czguMjI4NTcxLTE4LjI4NTcxNCAxOC4yODU3MTQtMTguMjg1NzE0aDU0Ljg1NzE0M2MxMC4wNTcxNDMgMCAxOC4yODU3MTQgOC4yMjg1NzEgMTguMjg1NzE1IDE4LjI4NTcxNHMtOC4yMjg1NzEgMTguMjg1NzE0LTE4LjI4NTcxNSAxOC4yODU3MTR6IiBmaWxsPSIjMjQ4QkZGIiBwLWlkPSIzNjU3Ij48L3BhdGg+PC9zdmc+PCEtLSDljp/mlofku7blkI3vvJoi57uE5oCB5bel5YW3LnN2ZyIgLS0+ // @supportURL https://github.com/linying23333 // @homepage https://github.com/linying23333 // @run-at document-idle // @grant none // @namespace https://greasyfork.org/users/1307848 // ==/UserScript== // @require http://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js // @note (预留的jQuery库,以便未来引用) // @icon 来自 https://www.iconfont.cn/ 如果侵犯您的权利请与我沟通 // @note 更新日志&常见问题解决:https://greasyfork.org/zh-CN/scripts/496221-%E6%8B%BC%E5%A4%9A%E5%A4%9A%E8%B7%A8%E5%A2%83-temu-%E5%BC%B9%E7%AA%97%E5%B1%8F%E8%94%BD/versions?show_all_versions=1 // @note 本js用户脚本版权归linying所有,仅供研究学习,禁止以任何形式倒卖 //这些参数只能输入数字,否则会导致错误. //时间需要根据您的电脑加载速度而定,切勿无脑调低或者调高 //设置执行等待时间 let WaitTime = 4200; // 单位毫秒,1秒 = 1000毫秒 //设置为 1 不启用,推荐值为3800 //是否展示调价菜单 let ShowPriceMenu = 1; // 默认为"1",设置为"0"则为不展示 //快速删除间隔时间 let FastIntervalTime = 1; // 单位毫秒,1秒 = 1000毫秒 //快速删除持续删除时间 let FastDuration = 1; // 单位毫秒,1秒 = 1000毫秒 //两个设置为 1 不启用,推荐值为8000 //是否弹出快速输出结束提示框 let FastShow = 0; // 默认为"0",设置为"1"则为展示 let debugMode = false; // 控制是否打印日志的开关,默认false(关闭),使用true(开启) 'use strict'; /* 防止代码因其他原因被执行多次 这段代码出自 Via轻插件,作者谷花泰 */ const key = encodeURIComponent('我 是 _拼多多跨境(Temu)弹窗屏蔽-测试版_:({<校验内容>}).'); if (window[key]) return; window[key] = true; // 全局定义是否打印日志调用函数 function log(message) { if (debugMode) { console.log('来自 拼多多跨境(Temu)弹窗屏蔽 js用户脚本提示:\n' + message); } } // 提示调试模式是否开启 (function() { log(`您的 Debug 模式值为 ${debugMode} ,调试模式打印日志已经启用`) })(); //添加一个手动去除按钮 (function() { // 创建一个新的按钮元素 var button = document.createElement('button'); button.id = 'js_button'; button.textContent = '清除弹窗!'; // 设置按钮样式以使其位于左上角 button.setAttribute('style' , 'z-index: 2147483647 !important; position: fixed; top: 96%; left: 30%;'); // 为按钮添加点击事件监听器 button.onclick = function() { log('手动清除按钮被点击'); removeElements(); alert('已经执行清除'); }; // 将按钮添加到的末尾 document.body.appendChild(button); })(); // 简单粗暴直接对所有都添加样式(显示为空)以屏蔽弹窗 //GM_addStyle("div[data-testid='beast-core-modal-mask']{display:none !important}"); //GM_addStyle("div[data-testid='beast-core-modal']{display:none !important}"); // 已弃用 // 提示用户js用户脚本将会等待变量值 WaitTime 毫秒 // alert(`将会等待 ${WaitTime / 1000} 秒后开始执行`); // 已弃用 insertModalDivs(`将会等待 ${WaitTime / 1000} 秒后开始执行删除`); setTimeout(function() { // insertModalDivs 函数已经定义,并且接收文本参数来插入模态框 insertModalDivs('开始操作'); // 使用你想要显示的文本作为参数 setTimeout(function() { // 直接在setTimeout回调中调用remove函数 remove(); }, 0); // 延迟0毫秒 }, WaitTime); // 延迟WaitTime毫秒 // remove 函数的定义 function remove() { // 检查 document.readyState 是否为 'loading' if (document.readyState === 'loading') { // 如果还在加载中,等待 DOMContentLoaded 事件 document.addEventListener('DOMContentLoaded', startInterval); } else { // 如果 DOM 已经加载完成,则直接执行删除操作 startInterval(); } } // 定义一个变量来存储interval ID,以便稍后清除它 let intervalId; // 启动interval的函数 function startInterval() { // 设置interval来每X毫秒执行removeElements intervalId = setInterval(removeElements, FastIntervalTime); // 这里的单位是毫秒,你可以根据需要调整 // 设置timeout来在 FastDuration 毫秒后退出执行 setTimeout(() => { clearInterval(intervalId); // 检查两个值是否不同,则弹出提示 if (FastIntervalTime !== FastDuration) { log(`${FastDuration} 毫秒已过,停止删除操作。`); // 如果FastShow为1,则弹出提示框 if (FastShow === 1) { alert(`设置的循环时间 ${FastDuration} 毫秒到了,您可以继续操作了 `); } } else { log('快速模式未启用'); // 注意:分号应该在括号外面 } }, FastDuration); // 这里的单位是毫秒,你可以根据需要调整 } function removeElements() { // 移除具有特定id属性的div元素(js_info) const elementsWithTestId0 = document.querySelectorAll('div[id="js_info"]'); elementsWithTestId0.forEach(element => element.remove()); // 查找并删除具有特定data-testid属性的div元素 const elementsWithTestId = document.querySelectorAll('div[data-testid="beast-core-modal"]'); elementsWithTestId.forEach(element => { let shouldRemoveParent = true; // 初始化变量 // 查找 modalDiv 之前的具有 data-testid="beast-core-modal-mask" 的 div 元素 let maskDiv = element.previousElementSibling; while (maskDiv && !maskDiv.matches('div[data-testid="beast-core-modal-mask"]')) { maskDiv = maskDiv.previousElementSibling; } // 如果ShowPriceMenu为0,则直接删除元素,不检查子结构 if (ShowPriceMenu === 0) { element.remove(); return; // 跳出当前循环,因为已经删除了元素 } // 查找包含“切换店铺”文本的div const switchShopDiv = element.querySelector('.layout_title__1eHi_'); if (switchShopDiv && switchShopDiv.textContent.trim().includes('切换店铺')) { shouldRemoveParent = false; // 如果找到,不删除父元素 } // 在当前element中查找所有匹配的元素 const headers = element.querySelectorAll('.TB_thead_5-109-0 .TB_th_5-109-0'); headers.forEach(header => { // 检查元素的文本内容是否包含"调价原因" if (header.textContent.trim().includes('调价原因')) { shouldRemoveParent = false; // 不删除或隐藏父元素 // 如果需要,可以在这里添加其他逻辑,比如修改的样式 // header.style.display = 'none'; // 隐藏元素(如果需要) return; // 跳出内部循环的当前迭代 } }); // 根据shouldRemoveParent的值执行操作 if (shouldRemoveParent) { log('没有找到包含 "调价原因" 或 "切换店铺" 的元素'); element.remove(); // 如果找到了匹配的 maskDiv,则删除它 if (maskDiv && maskDiv.matches('div[data-testid="beast-core-modal-mask"]')) { maskDiv.parentNode.removeChild(maskDiv); } } else { log('找到包含 "调价原因" 或 "切换店铺" 的元素'); } //结束后删除空的div setTimeout(function() { // 调用函数以删除body尾部的空div removeEmptyDivsAtBodyEnd(); }, WaitTime + FastDuration + 10000); // 延迟:毫秒 }); } // insertModalDivs 函数的定义(如果它在其他地方没有定义的话) function insertModalDivs(text) { // 这里是插入模态框的代码 // 插入遮罩层 div const newDiv0 = document.createElement('div'); //创建div元素 newDiv0.id = 'js_info'; // 设置id为js_info newDiv0.setAttribute('data-testid', 'beast-core-modal-mask'); //设置属性值"data-testid"的值为"beast-core-modal-mask" newDiv0.setAttribute('class', 'MDL_mask_5-109-0'); newDiv0.setAttribute('style', 'z-index: 2147483647 !important; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.5); /* 示例背景色,可以根据需要调整 */'); // 将遮罩层 div 添加到 body 的末尾 document.body.appendChild(newDiv0); // 插入模态框 div const newDiv = document.createElement('div'); newDiv.id = 'js_info'; // 设置id为js_info newDiv.setAttribute('data-testid', 'beast-core-modal'); newDiv.setAttribute('class', 'MDL_outerWrapper_5-109-0 MDL_alert_5-109-0 undefined'); newDiv.setAttribute('style', 'z-index: 2147483647 !important; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%);'); // 居中显示 // 设置模态框的内容 newDiv.innerHTML = `

`; //网页结构复用拼多多中心消息提示 // 将模态框 div 添加到 body 的末尾(通常在遮罩层之后) document.body.appendChild(newDiv); } // 防抖函数实现 function debounce(func, wait) { let timeout; return function() { const context = this; const args = arguments; clearTimeout(timeout); timeout = setTimeout(() => func.apply(context, args), wait); }; } //监听切换功能区 // 获取.index-module__menuBox___2aaTA元素,并为其添加click事件监听器 //并且参数传递到debounce进行去重 document.querySelector('.index-module__menuBox___2aaTA').addEventListener('click', debounce(function(event) { if (event.target.closest('.index-module__menuBox___2aaTA')) { // 检查点击的目标是否是.bg-shell-theme-menu-mms的后代 var mmsDescendant = event.target.closest('.bg-shell-theme-menu-mms'); if (mmsDescendant) { // 进一步检查点击的目标是否是.index-module__menu___3Wyz- .bg-shell-theme-menu的后代 // 但不是.bg-shell-theme-menu-mms的直接后代 var menuDescendant = event.target.closest('.index-module__menu___3Wyz- .bg-shell-theme-menu'); if (menuDescendant && mmsDescendant !== menuDescendant.parentNode) { // 这里表示匹配成功 log('匹配到.index-module__menu___3Wyz- .bg-shell-theme-menu .bg-shell-theme-menu-mms下的.index-module__menu___3Wyz- .bg-shell-theme-menu的后代元素触发的点击'); // 可以在这里添加点击事件的处理逻辑 var longtimelist = [ '/goods/product/list', '/main/sale-manage/main' ]; setTimeout(function() { log(`等待 100 毫秒,加载网址进行匹配`); var currentPath = window.location.pathname; // 路径部分 let time; //初始化变量 if (longtimelist.includes(currentPath)) { time = 1200; } else { time = 760; }//判断是否匹配长时间列表 setTimeout(function() { log(`已经等待 ${time} 毫秒,执行删除函数`); // 调用函数以删除body尾部的空div removeElements(); setTimeout(function() { CheckWebError(); }, 1000); // 延迟:毫秒 }, time); // 延迟:毫秒 }, 100); // 延迟:毫秒 } } } }, 1000)); // 定义删除尾部空div function removeEmptyDivsAtBodyEnd() { // 获取body元素的最后一个子节点 let lastChild = document.body.lastChild; // 循环检查body的最后一个子节点,直到找到非div或遇到空的div while (lastChild && lastChild.nodeName.toLowerCase() === 'div') { // 检查textContent是否为空字符串(忽略空格和换行符) if (!lastChild.textContent.trim()) { // 如果为空,则移除它 lastChild.parentNode.removeChild(lastChild); // 更新lastChild为新的最后一个子节点 lastChild = document.body.lastChild; } else { // 如果不是空的div,则停止循环(因为已经找到了非空或者非div的节点) break; } } } function CheckWebError() { // root元素的引用 const rootDiv = document.querySelector('div[id="root"]'); // 使用TreeWalker来遍历DOM树 const walker = document.createTreeWalker( rootDiv, NodeFilter.SHOW_COMMENT, // 只对注释节点感兴趣 { acceptNode: function(node) { return NodeFilter.FILTER_ACCEPT; } }, false // 不扩展实体引用 ); let NotFoundAllComments = true; // 假设所有注释都已找到 const commentsToFind = [ 'script https://bstatic.cdnfe.com/static/main/maihuo/static/js/bgb-sc-main/runtime~main.ce42606d.js replaced by import-html-entry', 'script https://bstatic.cdnfe.com/static/main/maihuo/static/js/bgb-sc-main/48.209360ea.chunk.js replaced by import-html-entry', 'script https://bstatic.cdnfe.com/static/main/maihuo/static/js/bgb-sc-main/main.a38fe5f9.chunk.js replaced by import-html-entry' ]; // 遍历注释节点 while(walker.nextNode()) { const commentNode = walker.currentNode; const commentText = commentNode.nodeValue.trim(); log(`${commentText}`) // 检查是否找到注释 if (commentsToFind.some(comment => commentText.includes(comment))) { // 如果找到,从列表中移除该注释 const index = commentsToFind.indexOf(commentText); if (index !== -1) { commentsToFind.splice(index, 1); } } // 如果还有未找到的注释,NotFoundAllComments保持为true if (commentsToFind.length > 0) { NotFoundAllComments = false; } } // 检查是否所有注释都已找到 if (!NotFoundAllComments) { log('找到所有定义的错误注释,刷新网页'); // 尝试刷新页面(注意:这可能会中断用户的当前操作) location.reload(); } else { log('未找到所有定义的错误注释,未刷新网页'); } }