您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
【最终彻底无动画】确保在 Swiper 初始化后立即去除动画,并完全兼容首图无Prev、末图无Next按钮情况。
// ==UserScript== // @name 懂车帝看图体验优化 - 图片秒切,告别滑动动画 // @version 1.1 // @description 【最终彻底无动画】确保在 Swiper 初始化后立即去除动画,并完全兼容首图无Prev、末图无Next按钮情况。 // @author NIA // @license GPL-3.0-only // @match https://www.dongchedi.com/* // @grant none // @run-at document-idle // @namespace http://tampermonkey.net/ // ==/UserScript== (function() { 'use strict'; console.log('【懂车帝秒切脚本】: V1.0 已启动,正在监听页面变化...'); // ------------------- 配置区 ------------------- const NEXT_BUTTON_SELECTOR = 'a[class*="head-image_right__"]'; const PREV_BUTTON_SELECTOR = 'a[class*="head-image_left__"]'; const SWIPER_WRAPPER_SELECTOR = '.swiper-wrapper'; const SWIPER_CONTAINER_SELECTOR = '.swiper-container.head-image_swiper__P7S3Z'; // ---------------------------------------------------------------- let swiperInitializationObserver = null; let swiperAnimationFixObserver = null; // 核心逻辑:确保 Swiper 动画始终为0ms const disableSwiperAnimation = (wrapperElement) => { if (wrapperElement) { wrapperElement.style.transitionDuration = '0ms'; wrapperElement.style.transitionProperty = 'none'; // console.log('Swiper动画已强制设置为0ms。'); // 调试用,如果不需要可以注释掉 } }; function setupInstantSwitcher() { const swiperWrapper = document.querySelector(SWIPER_WRAPPER_SELECTOR); const nextButton = document.querySelector(NEXT_BUTTON_SELECTOR); const prevButton = document.querySelector(PREV_BUTTON_SELECTOR); console.log('--- 尝试捕获关键元素 (V1.0) ---'); console.log('Swiper Wrapper:', swiperWrapper); console.log('Next Button:', nextButton); // 可能为 null console.log('Prev Button:', prevButton); // 可能为 null // 核心检查:只有 swiperWrapper 必须存在 // 如果 Swiper Wrapper 都不存在,则说明页面结构不匹配或Swiper未加载 if (!swiperWrapper) { console.error('【秒切脚本V1.0错误】: 未能捕获到 Swiper Wrapper。脚本终止。'); return; } // 立即尝试去除动画,以防Swiper在我们之前初始化 disableSwiperAnimation(swiperWrapper); // 创建持久的观察者,监听 swiper-wrapper 的 style 属性变化 // 这是为了捕获 Swiper 在切换图片时可能再次设置动画持续时间的情况 if (!swiperAnimationFixObserver) { // 确保只创建一次观察者 swiperAnimationFixObserver = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.type === 'attributes' && mutation.attributeName === 'style') { // 检查是否是 Swiper 尝试添加过渡效果 (即设置了一个非零的动画时间) if (swiperWrapper.style.transitionDuration !== '0s' && swiperWrapper.style.transitionDuration !== '0ms' && swiperWrapper.style.transitionDuration !== '') { // 如果 Swiper 设置了一个非零的动画时间,立即覆盖它 disableSwiperAnimation(swiperWrapper); // console.log('Swiper动画被重新覆盖为0ms!'); // 调试用,如果不需要可以注释掉 } } }); }); // 监听 swiperWrapper 的属性变化,尤其是 style 属性 swiperAnimationFixObserver.observe(swiperWrapper, { attributes: true, attributeFilter: ['style'] }); console.log('【懂车帝秒切脚本】: 已启动 Swiper Wrapper 动画修复监听。'); } // 监听按钮点击事件 const setupButtonClick = (button) => { // 只有当按钮元素存在时才添加事件监听器 if (button) { button.addEventListener('click', (e) => { console.log('--- 按钮点击事件被捕获 (V1.0) ---'); // 在点击时,再次确保动画关闭,以防万一 disableSwiperAnimation(swiperWrapper); // 不再阻止默认行为 (e.preventDefault()) 和事件冒泡 (e.stopPropagation()) // 这是为了让 Swiper 的原生点击事件完全执行,确保其内部状态的正确更新。 // 我们只通过修改样式来去除动画,而不是替代其切换逻辑。 }, true); // 使用捕获模式确保我们的监听器最先执行 } }; // 对两个按钮都调用 setupButtonClick,它内部会判断按钮是否存在并决定是否绑定监听器 setupButtonClick(nextButton); setupButtonClick(prevButton); console.log('【懂车帝秒切脚本】: V1.0 已成功接管翻页链接(完全兼容无Prev/Next按钮)!'); } // 主观察者:监听 Swiper 容器是否初始化完成 // 注意:将 @run-at 改为 document-idle 可以让脚本更晚执行,可能会有帮助 const mainObserver = new MutationObserver((mutationsList) => { const swiperContainer = document.querySelector(SWIPER_CONTAINER_SELECTOR); // 检查 Swiper 容器是否存在且包含 'swiper-container-initialized' 类 if (swiperContainer && swiperContainer.classList.contains('swiper-container-initialized')) { console.log('【懂车帝秒切脚本】: 检测到 Swiper 容器已初始化完成!'); setupInstantSwitcher(); // Swiper 初始化完成后,才执行秒切逻辑 mainObserver.disconnect(); // 一旦 Swiper 初始化完成并设置了秒切,就停止监听容器,避免重复执行 } }); // 开始监视整个页面的子节点和子树变化,以捕获 Swiper 容器的出现和类名变化 // attributes: true, attributeFilter: ['class'] 是为了监听 swiper-container 上的 class 属性变化, // 以便捕获 'swiper-container-initialized' 类的添加。 mainObserver.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['class'] }); })();