您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
拖拽链接时在弹出窗口中打开链接,并在打开前提供预览,使用 Edge 的预读技术。同时在小窗口打开时在背后添加亚克力效果。
当前为
// ==UserScript== // @name Small Window Preview // @description Drag a link to open it in a popup window with a preview before opening, using Edge's prerendering technology. Also, add an acrylic effect behind the window when it's open. // @name:en Small Window Preview // @description:en Drag a link to open it in a popup window with a preview before opening, using Edge's prerendering technology. Also, add an acrylic effect behind the window when it's open. // @name:zh-CN 小窗预览 // @description:zh-CN 拖拽链接时在弹出窗口中打开链接,并在打开前提供预览,使用 Edge 的预读技术。同时在小窗口打开时在背后添加亚克力效果。 // @name:zh-TW 小窗預覽 // @description:zh-TW 拖曳連結時在彈出視窗中打開連結,並在打開前提供預覽,使用 Edge 的預讀技術。同時在小窗口打開時在背後添加壓克力效果。 // @name:ja 小窓プレビュー // @description:ja リンクをドラッグしてポップアップウィンドウでプレビューを表示し、Edge のプレビュー技術を使用して開く前にリンクを開きます。また、ウィンドウが開いているときにアクリル効果を背景に追加します。 // @name:vi Xem trước cửa sổ nhỏ // @description:vi Kéo thả liên kết để mở nó trong một cửa sổ popup với chế độ xem trước trước khi mở, sử dụng công nghệ tiên đoán của Edge. Đồng thời, thêm hiệu ứng acrylic phía sau cửa sổ khi nó mở. // @version 2.4 // @author 人民的勤务员 <[email protected]> & hiisme // @match *://*/* // @grant GM_registerMenuCommand // @grant GM_getValue // @grant GM_setValue // @grant GM_info // @namespace https://gf.qytechs.cn/users/217852 // @supportURL https://github.com/ChinaGodMan/UserScripts/issues // @homepageURL https://github.com/ChinaGodMan/UserScripts // ==/UserScript== (function () { 'use strict' const state = { isDragging: false, linkToPreload: null, popupWindow: null, acrylicOverlay: null, } const config = { windowWidth: GM_getValue('windowWidth', 870), windowHeight: GM_getValue('windowHeight', 530), screenLeft: (window.screen.width - GM_getValue('windowWidth', 870)) / 2, screenTop: (window.screen.height - GM_getValue('windowHeight', 530)) / 3, blurIntensity: GM_getValue('blurIntensity', 5), blurEnabled: GM_getValue('blurEnabled', true), closeOnMouseClick: GM_getValue('closeOnMouseClick', true), closeOnScroll: GM_getValue('closeOnScroll', true), longPressDuration: GM_getValue('longPressDuration', 500), // 长按持续时间(毫秒) actionMode: GM_getValue('actionMode', 0), // 0: 两者都用, 1: 长按, 2: 拖拽 } function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)) } async function preloadLink(link, attributes = {}) { const preloadElement = document.createElement('link') preloadElement.rel = 'preload' preloadElement.href = link preloadElement.as = '*/*' Object.assign(preloadElement, attributes) document.head.appendChild(preloadElement) await delay(1) } function createAcrylicOverlay() { const acrylicOverlay = document.createElement('div') acrylicOverlay.style.position = 'fixed' acrylicOverlay.style.top = '0' acrylicOverlay.style.left = '0' acrylicOverlay.style.width = '100%' acrylicOverlay.style.height = '100%' acrylicOverlay.style.zIndex = '9999' acrylicOverlay.style.backdropFilter = config.blurEnabled ? `blur(${config.blurIntensity}px)` : 'none' if (config.closeOnMouseClick) { acrylicOverlay.addEventListener('click', handleAcrylicOverlayClick) } document.body.appendChild(acrylicOverlay) return acrylicOverlay } function handleAcrylicOverlayClick(event) { if (event.target === state.acrylicOverlay) { closePopupWindow() } } function removeAcrylicOverlay() { if (state.acrylicOverlay) { document.body.removeChild(state.acrylicOverlay) state.acrylicOverlay = null } } function openPopupWindow(link) { if (!state.popupWindow || state.popupWindow.closed) { state.acrylicOverlay = createAcrylicOverlay() state.popupWindow = window.open(link, '_blank', `width=${config.windowWidth},height=${config.windowHeight},left=${config.screenLeft},top=${config.screenTop}`) // console.log('Popup window:', state.popupWindow) state.popupWindowChecker = setInterval(() => { if (state.popupWindow.closed) { removeAcrylicOverlay() clearInterval(state.popupWindowChecker) } }, 500) } } function closePopupWindow() { if (state.popupWindow && !state.popupWindow.closed) { state.popupWindow.close() state.popupWindow = null removeAcrylicOverlay() if (state.linkToPreload) { removePreloadedLink(state.linkToPreload) } window.removeEventListener('scroll', closePopupOnScroll) } } function removePreloadedLink(link) { const preloadElement = document.querySelector(`link[href="${link}"]`) if (preloadElement) { document.head.removeChild(preloadElement) } } function closePopupOnScroll() { if (state.popupWindow && !state.popupWindow.closed) { closePopupWindow() } } function registerMenuCommand(label, action) { return GM_registerMenuCommand(label, () => { action() updateMenuCommands() }) } function toggleActionMode() { const mode = prompt('选择触发方式:\n1: 长按\n2: 拖拽\n0: 两者都用', config.actionMode) if (mode !== null) { config.actionMode = parseInt(mode, 10) GM_setValue('actionMode', config.actionMode) setupEventListeners() } } const menuCommands = [ { label: `选择触发方式 (${config.actionMode === 1 ? '长按' : config.actionMode === 2 ? '拖拽' : '两者都用'})`, action: toggleActionMode }, { label: `长按触发时间 (${config.longPressDuration}ms)`, action: setLongPressDuration }, { label: `切换模糊效果 (${config.blurEnabled ? '✅' : '❌'})`, action: toggleBlurEffect }, { label: `设置模糊强度 (${config.blurIntensity})`, action: setBlurIntensity }, { label: `切换点击关闭小窗 (${config.closeOnMouseClick ? '✅' : '❌'})`, action: toggleCloseOnMouseClick }, { label: `切换滚动关闭小窗 (${config.closeOnScroll ? '✅' : '❌'})`, action: toggleCloseOnScroll }, { label: `设置小窗宽度 (${config.windowWidth})`, action: () => { setWindowSize('width') } }, { label: `设置小窗高度 (${config.windowHeight})`, action: () => { setWindowSize('height') } } ] function setLongPressDuration() { const duration = prompt('输入长按触发时间(毫秒):', config.longPressDuration) if (duration !== null) { GM_setValue('longPressDuration', duration) } } function toggleBlurEffect() { config.blurEnabled = !config.blurEnabled GM_setValue('blurEnabled', config.blurEnabled) } function setBlurIntensity() { const intensity = prompt('输入模糊强度(0-10):', config.blurIntensity) if (intensity !== null) { config.blurIntensity = parseInt(intensity, 10) GM_setValue('blurIntensity', config.blurIntensity) } } function toggleCloseOnMouseClick() { config.closeOnMouseClick = !config.closeOnMouseClick GM_setValue('closeOnMouseClick', config.closeOnMouseClick) } function toggleCloseOnScroll() { config.closeOnScroll = !config.closeOnScroll handleScrollCommand() GM_setValue('closeOnScroll', config.closeOnScroll) } function handleScrollCommand() { if (config.closeOnScroll) { window.addEventListener('scroll', closePopupOnScroll, { once: true }) } else { window.removeEventListener('scroll', closePopupOnScroll) } } function setWindowSize(dimension) { const size = prompt(`输入小窗口${dimension}(像素):`, config[dimension === 'width' ? 'windowWidth' : 'windowHeight']) if (size !== null) { config[dimension === 'width' ? 'windowWidth' : 'windowHeight'] = parseInt(size, 10) GM_setValue(dimension === 'width' ? 'windowWidth' : 'windowHeight', config[dimension === 'width' ? 'windowWidth' : 'windowHeight']) if (state.popupWindow && !state.popupWindow.closed) { state.popupWindow.resizeTo(config.windowWidth, config.windowHeight) } } } function updateMenuCommands() { menuCommands.forEach((command) => { const menuCommand = registerMenuCommand(command.label, command.action) GM_info[`menuCommand${toTitleCase(command.label)}`] = menuCommand }) } function toTitleCase(str) { return str.replace(/\w\S*/g, (txt) => { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase() }) } updateMenuCommands() function setupEventListeners() { // 移除旧的事件监听器 document.body.removeEventListener('dragstart', handleDragStart) document.body.removeEventListener('dragend', handleDragEnd) document.body.removeEventListener('mousedown', handleMouseDown) document.body.removeEventListener('mouseup', handleMouseUp) document.body.removeEventListener('mouseleave', handleMouseLeave) document.body.removeEventListener('wheel', handleWheel) document.body.removeEventListener('click', handleClick) // 根据 actionMode 配置添加事件监听器 if (config.actionMode === 1 || config.actionMode === 0) { document.body.addEventListener('mousedown', handleMouseDown) document.body.addEventListener('mouseup', handleMouseUp) document.body.addEventListener('mouseleave', handleMouseLeave) } if (config.actionMode === 2 || config.actionMode === 0) { document.body.addEventListener('dragstart', handleDragStart) document.body.addEventListener('dragend', handleDragEnd) } document.body.addEventListener('wheel', handleWheel) document.body.addEventListener('click', handleClick) } // 事件处理函数 function handleDragStart(event) { const linkElement = event.target.tagName === 'A' ? event.target : event.target.closest('a') if (linkElement) { const link = linkElement.href state.isDragging = true state.linkToPreload = link preloadLink(state.linkToPreload, { importance: 'high' }).then(() => { if (config.closeOnScroll) { window.addEventListener('scroll', closePopupOnScroll, { once: true }) } }) } } function handleDragEnd() { if (state.isDragging && state.linkToPreload) { state.isDragging = false openPopupWindow(state.linkToPreload) state.linkToPreload = null } } function handleMouseDown(event) { const linkElement = event.target.tagName === 'A' ? event.target : event.target.closest('a') if (linkElement) { state.pressTimer = setTimeout(() => { const link = linkElement.href state.linkToPreload = link preloadLink(state.linkToPreload, { importance: 'high' }).then(() => { openPopupWindow(state.linkToPreload) }) }, config.longPressDuration) } } function handleMouseUp() { clearTimeout(state.pressTimer) state.pressTimer = null } function handleMouseLeave() { clearTimeout(state.pressTimer) state.pressTimer = null } function handleWheel() { if (config.closeOnScroll) { closePopupWindow() } } function handleClick(event) { if (event.target === state.acrylicOverlay) { removeAcrylicOverlay() } } setupEventListeners() })()
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址