Greasy Fork

Greasy Fork is available in English.

禁用电商平台图片缩放效果

禁用淘宝、天猫、1688等电商平台的js-image-zoom效果,方便右键保存图片。

当前为 2025-05-27 提交的版本,查看 最新版本

// ==UserScript==
// @name         禁用电商平台图片缩放效果
// @name:en      Disable E-commerce Image Zoom Effect
// @namespace    http://greasyfork.icu/users/3001-hanjian-wu
// @version      1.3.0
// @description  禁用淘宝、天猫、1688等电商平台的js-image-zoom效果,方便右键保存图片。
// @description:en Disable js-image-zoom effect on Taobao, Tmall, 1688 and other e-commerce platforms for easy right-click image saving. Fully fixed right-click direct access to images
// @author       hanjian wu
// @homepage     http://greasyfork.icu/users/3001-hanjian-wu
// @supportURL   http://greasyfork.icu/users/3001-hanjian-wu
// @license      MIT
// @match        https://detail.tmall.com/*
// @match        https://item.taobao.com/*
// @match        https://detail.1688.com/*
// @match        https://www.tmall.com/p/*
// @match        https://www.taobao.com/item/*
// @match        https://www.1688.com/offer/*
// @match        https://*.tmall.com/item.htm*
// @match        https://*.taobao.com/item.htm*
// @match        https://*.1688.com/offer/*.html*
// @icon         data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iOCIgZmlsbD0iIzAwN0FGRiIvPgo8cGF0aCBkPSJNMTYgMTZIMzJWMzJIMTZWMTZaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMzYgMTZINDhWMjhIMzZWMTZaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMTYgMzZIMjhWNDhIMTZWMzZaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMzIgMzJINDhWNDhIMzJWMzJaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjciLz4KPC9zdmc+
// @grant        none
// @run-at       document-start
// @noframes
// @compatible   chrome
// @compatible   firefox
// @compatible   edge
// @compatible   safari
// ==/UserScript==

(function() {
    'use strict';

    console.log('电商图片缩放禁用脚本已启动 v1.3.0');

    // 检测当前平台
    const is1688 = window.location.hostname.includes('1688.com');
    const isTaobao = window.location.hostname.includes('taobao.com');
    const isTmall = window.location.hostname.includes('tmall.com');

    let zoomEventBlocked = false;

    // 禁用图片缩放的主要函数
    function disableImageZoom() {
        if (is1688) {
            handle1688Zoom();
        } else {
            handleTaobaoTmallZoom();
        }
    }

    // 处理1688的缩放
    function handle1688Zoom() {
        const zoomElements = document.querySelectorAll('.scale-img, .scaled-img');
        zoomElements.forEach(el => {
            if (el.style.display !== 'none') {
                el.style.display = 'none !important';
                el.style.visibility = 'hidden !important';
                el.style.opacity = '0 !important';
                el.style.pointerEvents = 'none !important';
            }
        });

        // 确保主图片可以右键
        const previewImg = document.querySelector('.detail-gallery-preview .preview-img');
        if (previewImg) {
            enableImageRightClick(previewImg);
        }
    }

    // 处理淘宝/天猫的缩放 - 重点修复右键问题
    function handleTaobaoTmallZoom() {
        // 隐藏缩放相关元素
        const zoomElements = document.querySelectorAll('.js-image-zoom__zoomed-area, .js-image-zoom__zoomed-image, #lensDiv');
        zoomElements.forEach(el => {
            el.style.display = 'none !important';
            el.style.visibility = 'hidden !important';
            el.style.opacity = '0 !important';
            el.style.pointerEvents = 'none !important';
        });

        // 关键修复:让容器的鼠标事件穿透到图片
        const mainPicWrappers = document.querySelectorAll('._6ebaNqGH1t--mainPicWrap--b82041ed');
        mainPicWrappers.forEach(wrapper => {
            // 让容器的鼠标事件穿透
            wrapper.style.pointerEvents = 'none';

            // 找到其中的图片并确保可以接收鼠标事件
            const mainPic = wrapper.querySelector('._6ebaNqGH1t--mainPic--_8729489');
            if (mainPic) {
                // 让图片重新获得鼠标事件
                mainPic.style.pointerEvents = 'auto';
                mainPic.style.position = 'relative';
                mainPic.style.zIndex = '999';
                enableImageRightClick(mainPic);

                console.log('已修复图片右键功能:', mainPic.src);
            }
        });

        // 确保缩略图可以点击切换
        const thumbnails = document.querySelectorAll('._6ebaNqGH1t--thumbnail--e3bf7146');
        thumbnails.forEach(thumb => {
            thumb.style.pointerEvents = 'auto';
            const thumbImg = thumb.querySelector('._6ebaNqGH1t--thumbnailPic--_2b4183e');
            if (thumbImg) {
                thumbImg.style.pointerEvents = 'auto';
            }
        });

        // 确保切换标签可以点击
        const switchTabs = document.querySelectorAll('._6ebaNqGH1t--switchTabsItem--a42e6b76');
        switchTabs.forEach(tab => {
            tab.style.pointerEvents = 'auto';
        });
    }

    // 启用图片右键功能
    function enableImageRightClick(img) {
        if (!img) return;

        // 确保图片可以接收鼠标事件
        img.style.pointerEvents = 'auto';
        img.style.userSelect = 'auto';
        img.style.webkitUserSelect = 'auto';
        img.style.mozUserSelect = 'auto';
        img.style.msUserSelect = 'auto';

        // 移除所有可能阻止右键的事件处理器
        img.oncontextmenu = null;
        img.ondragstart = null;
        img.onselectstart = null;
        img.onmousedown = null;
        img.onmouseup = null;

        // 移除事件监听器(如果存在)
        const events = ['contextmenu', 'dragstart', 'selectstart', 'mousedown', 'mouseup'];
        events.forEach(eventType => {
            img.removeEventListener(eventType, preventDefault, true);
            img.removeEventListener(eventType, preventDefault, false);
        });

        // 添加强制允许右键的事件监听器
        img.addEventListener('contextmenu', function(e) {
            e.stopPropagation();
            console.log('图片右键菜单已启用');
            return true;
        }, true);

        img.addEventListener('mousedown', function(e) {
            if (e.button === 2) { // 右键
                e.stopPropagation();
                console.log('图片右键点击已启用');
                return true;
            }
        }, true);
    }

    // 阻止事件的通用函数
    function preventDefault(e) {
        e.preventDefault();
        e.stopPropagation();
        return false;
    }

    // 精准的事件拦截
    function blockZoomEvents() {
        if (zoomEventBlocked) return;
        zoomEventBlocked = true;

        // 拦截可能的缩放函数
        if (window.ImageZoom) {
            window.ImageZoom = function() { console.log('ImageZoom 被禁用'); };
        }

        // 拦截容器上的缩放事件,但保留其他功能
        const originalAddEventListener = Element.prototype.addEventListener;
        Element.prototype.addEventListener = function(type, listener, options) {
            // 对于主图片容器,只拦截可能的缩放事件
            const isMainPicContainer = this.classList && this.classList.contains('_6ebaNqGH1t--mainPicWrap--b82041ed');
            const isZoomMouseEvent = (type === 'mousemove' || type === 'mouseover' || type === 'mouseenter');

            if (isMainPicContainer && isZoomMouseEvent) {
                const listenerStr = listener.toString();
                if (listenerStr.includes('zoom') || listenerStr.includes('scale') || listenerStr.includes('lens')) {
                    console.log('拦截了容器缩放事件:', type);
                    return;
                }
            }

            // 对于1688
            const is1688ZoomElement = this.classList && (this.classList.contains('scale-img') || this.classList.contains('scaled-img'));
            if (is1688ZoomElement) {
                console.log('拦截了1688缩放事件:', type);
                return;
            }

            return originalAddEventListener.call(this, type, listener, options);
        };
    }

    // 添加CSS样式
    function addZoomDisableStyles() {
        const style = document.createElement('style');
        style.id = 'zoom-disable-styles';

        if (is1688) {
            style.textContent = `
                /* 1688 缩放元素禁用 */
                .detail-gallery-preview .scale-img,
                .detail-gallery-preview .scaled-img {
                    display: none !important;
                    visibility: hidden !important;
                    opacity: 0 !important;
                    pointer-events: none !important;
                }

                /* 确保1688图片可以右键 */
                .detail-gallery-preview .preview-img {
                    pointer-events: auto !important;
                    user-select: auto !important;
                    -webkit-user-select: auto !important;
                    position: relative !important;
                    z-index: 999 !important;
                }
            `;
        } else {
            style.textContent = `
                /* 淘宝天猫缩放元素禁用 */
                .js-image-zoom__zoomed-area,
                .js-image-zoom__zoomed-image,
                #lensDiv {
                    display: none !important;
                    visibility: hidden !important;
                    opacity: 0 !important;
                    pointer-events: none !important;
                }

                /* 关键修复:让容器鼠标事件穿透,图片获得最高优先级 */
                ._6ebaNqGH1t--mainPicWrap--b82041ed {
                    pointer-events: none !important;
                }

                /* 让主图片重新获得鼠标事件和最高层级 */
                ._6ebaNqGH1t--mainPic--_8729489 {
                    pointer-events: auto !important;
                    user-select: auto !important;
                    -webkit-user-select: auto !important;
                    -moz-user-select: auto !important;
                    -ms-user-select: auto !important;
                    position: relative !important;
                    z-index: 999 !important;
                    -webkit-touch-callout: default !important;
                    -webkit-user-select: auto !important;
                    -khtml-user-select: auto !important;
                }

                /* 确保缩略图可以点击 */
                ._6ebaNqGH1t--thumbnail--e3bf7146,
                ._6ebaNqGH1t--thumbnailPic--_2b4183e {
                    pointer-events: auto !important;
                }

                /* 确保切换标签可以点击 */
                ._6ebaNqGH1t--switchTabsItem--a42e6b76 {
                    pointer-events: auto !important;
                }

                /* 确保缩略图容器可以交互 */
                ._6ebaNqGH1t--thumbnailsWrap--_9878a4b,
                ._6ebaNqGH1t--thumbnails--_45f4c28 {
                    pointer-events: auto !important;
                }

                /* 确保底部切换标签容器可以交互 */
                ._6ebaNqGH1t--bottomSwitchTabsWrap--e5402120,
                ._6ebaNqGH1t--switchTabsWrap--_6fda09c {
                    pointer-events: auto !important;
                }
            `;
        }

        if (!document.getElementById('zoom-disable-styles')) {
            document.head.appendChild(style);
        }
    }

    // 强制移除右键阻止
    function forceEnableRightClick() {
        // 移除可能的全局右键阻止
        document.oncontextmenu = null;
        document.onselectstart = null;
        document.ondragstart = null;

        // 移除body上的右键阻止
        if (document.body) {
            document.body.oncontextmenu = null;
            document.body.onselectstart = null;
            document.body.ondragstart = null;
        }
    }

    // 监控动态变化
    function setupObserver() {
        const observer = new MutationObserver(function(mutations) {
            mutations.forEach(function(mutation) {
                if (mutation.type === 'childList') {
                    mutation.addedNodes.forEach(function(node) {
                        if (node.nodeType === 1) {
                            // 处理新添加的主图片
                            if (!is1688) {
                                const newMainPics = node.querySelectorAll ? node.querySelectorAll('._6ebaNqGH1t--mainPic--_8729489') : [];
                                newMainPics.forEach(img => {
                                    img.style.pointerEvents = 'auto';
                                    img.style.position = 'relative';
                                    img.style.zIndex = '999';
                                    enableImageRightClick(img);
                                    console.log('新图片右键功能已启用:', img.src);
                                });

                                // 处理新添加的容器
                                const newWrappers = node.querySelectorAll ? node.querySelectorAll('._6ebaNqGH1t--mainPicWrap--b82041ed') : [];
                                newWrappers.forEach(wrapper => {
                                    wrapper.style.pointerEvents = 'none';
                                });
                            }

                            // 处理新添加的缩放元素
                            if (is1688) {
                                if (node.classList && (node.classList.contains('scale-img') || node.classList.contains('scaled-img'))) {
                                    node.style.display = 'none';
                                    node.style.pointerEvents = 'none';
                                }
                                const zoomElements = node.querySelectorAll('.scale-img, .scaled-img');
                                zoomElements.forEach(el => {
                                    el.style.display = 'none';
                                    el.style.pointerEvents = 'none';
                                });
                            } else {
                                if (node.classList && (node.classList.contains('js-image-zoom__zoomed-area') || node.classList.contains('js-image-zoom__zoomed-image'))) {
                                    node.style.display = 'none';
                                    node.style.pointerEvents = 'none';
                                }
                                const zoomElements = node.querySelectorAll('.js-image-zoom__zoomed-area, .js-image-zoom__zoomed-image');
                                zoomElements.forEach(el => {
                                    el.style.display = 'none';
                                    el.style.pointerEvents = 'none';
                                });
                            }
                        }
                    });
                }
            });
        });

        observer.observe(document.body, {
            childList: true,
            subtree: true
        });
    }

    // 初始化函数
    function init() {
        console.log('初始化电商图片缩放禁用脚本...');

        blockZoomEvents();
        addZoomDisableStyles();
        disableImageZoom();
        forceEnableRightClick();
        setupObserver();

        // 延迟执行,确保页面完全加载
        setTimeout(() => {
            disableImageZoom();
            forceEnableRightClick();
            console.log('延迟修复完成');
        }, 1000);

        setTimeout(() => {
            disableImageZoom();
            forceEnableRightClick();
            console.log('二次延迟修复完成');
        }, 3000);
    }

    // 启动脚本
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }

    // 定期维护
    setInterval(() => {
        disableImageZoom();
        forceEnableRightClick();
    }, 5000);

    console.log('电商图片缩放禁用脚本加载完成 v1.3.0 - 专门修复右键问题');
})();