Greasy Fork

Greasy Fork is available in English.

115网盘-在新窗口打开

为115网盘右键添加“新窗口打开”功能

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         115网盘-在新窗口打开
// @namespace    http://tampermonkey.net/
// @version      20.0
// @author       Shane Yang
// @description  为115网盘右键添加“新窗口打开”功能
// @license      MIT
// @match        https://115.com/*
// @grant        none
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';

    console.log('[115脚本] v20.0 加载:自然关闭模式');

    // =========================================================
    // 1. 存数据 (公共储物柜)
    // =========================================================
    document.addEventListener('mousedown', function(e) {
        if (e.button !== 2) return; // 只管右键

        const row = e.target.closest('li');
        if (!row) return;

        let cid = row.getAttribute('cate_id') ||
                  row.querySelector('input[type="checkbox"]')?.value ||
                  row.querySelector('a.name')?.getAttribute('cid');

        if (cid) {
            sessionStorage.setItem('tm_115_target_cid', cid);
        }
    }, true);


    // =========================================================
    // 2. 辅助函数:模拟在空白处点击
    // =========================================================
    function triggerPageReset() {
        const body = document.body;
        const eventParams = {
            bubbles: true,
            cancelable: true,
            view: window,
            button: 0 // 左键
        };

        // 既然要模拟点击空白处,我们必须让菜单自然关闭
        // 这一套动作发出去,115网页会认为用户点击了外面,自动收起菜单
        body.dispatchEvent(new MouseEvent('mousedown', eventParams));
        body.dispatchEvent(new MouseEvent('mouseup', eventParams));
        body.dispatchEvent(new MouseEvent('click', eventParams));
    }


    // =========================================================
    // 3. 插按钮
    // =========================================================
    function injectBtn() {
        const lis = document.querySelectorAll('li');

        lis.forEach(li => {
            if (li.innerText.includes('刷新') && !li.innerText.includes('窗口') && li.offsetParent) {

                const ul = li.parentNode;
                if (ul.querySelector('#tm-action-btn')) return;

                const btn = document.createElement('li');
                btn.id = 'tm-action-btn';
                btn.className = li.className;
                btn.style.display = 'list-item';

                btn.innerHTML = `
                    <a href="javascript:;" style="color: #06a7ff; font-weight: bold;">
                        <i class="icon-operate ifo-open"></i>
                        <span>在新窗口打开</span>
                    </a>
                `;

                // =========================================================
                // 4. 点击逻辑
                // =========================================================
                btn.onclick = function(e) {
                    e.stopPropagation();
                    e.preventDefault();

                    // 1. 获取 ID
                    const cid = sessionStorage.getItem('tm_115_target_cid');

                    // 2. 【核心修复】移除所有 style.display = 'none' 的操作!
                    // 不要手动隐藏菜单,而是调用下面的模拟点击函数

                    // 3. 模拟点击空白处 (这会自然关闭菜单,并刷新页面状态)
                    triggerPageReset();

                    // 4. 打开窗口
                    if (cid) {
                        const url = `https://115.com/?cid=${cid}&offset=0&mode=wangpan`;
                        window.open(url, '_blank');
                    } else {
                        // 兜底提示
                        console.log('CID缺失');
                    }
                };

                ul.insertBefore(btn, ul.firstChild);
            }
        });
    }

    setInterval(injectBtn, 500);

})();