Tampermonkey脚本重定位window.open弹出窗口失效问题求助
脚本不生效的核心原因
- 浏览器默认禁用了页面脚本自主移动窗口的权限:绝大多数主流浏览器为了防止恶意页面随意调整窗口位置骚扰用户,默认关闭了普通页面脚本调用
moveBy/moveTo移动自身窗口的权限,仅允许打开该窗口的父页面脚本操作对应子窗口的位置。 - 你的操作被原应用的窗口居中逻辑覆盖:原Web应用调用
window.open打开新窗口后,本身附带了将弹窗居中的后续代码,你的脚本执行时机早于原应用的居中逻辑,执行的moveBy结果被后续的居中操作覆盖了。
现有脚本调整方案
如果要保留在弹窗内执行脚本的方案,可按以下步骤调整:
- 先修改浏览器站点权限:打开弹窗页面的站点设置,找到「移动和调整窗口大小」权限,设置为允许。
- 调整脚本执行时机和逻辑,避免被原逻辑覆盖:
// ==UserScript== // @name Example - reposition popup // @namespace // @version 0.2 // @description reposition the popup window that appears when [Image] button is clicked // @author Thecommexokid // @match https://example.com/pdfViewer.html* // @icon https://www.google.com/s2/favicons?domain=openuserjs.org // @grant none // ==/UserScript== (function() { 'use strict'; // 等待原页面的居中逻辑执行完成后再调整位置,可根据实际情况调整延迟时长 setTimeout(() => { // 推荐用moveTo直接设置绝对位置,适配多显示器场景更稳定,比如1920是主屏宽度,直接放到副屏左上角 window.moveTo(1920, 0); // 如果要保留相对位移就用原来的window.moveBy(-968, -426) }, 500); // 为了避免极端情况覆盖失败,可以加个重复执行的逻辑,3秒后再确认一次位置 setTimeout(() => { window.moveTo(1920, 0); }, 3000); })();
更优实现方案
推荐直接在触发弹窗的父页面注入Tampermonkey脚本,Hook原生的window.open方法,在弹窗创建时直接设置位置,不需要修改浏览器权限,稳定性更高:
// ==UserScript== // @name Move popup to secondary screen // @namespace // @version 0.1 // @description Auto reposition popup opened by the site // @author Thecommexokid // @match 这里替换为触发弹窗的父页面的匹配规则 // @grant none // ==/UserScript== (function() { 'use strict'; // 保存原生的open方法 const originalOpen = window.open; // 重写open方法 window.open = function(url, windowName, windowFeatures) { // 调用原生方法打开窗口,拿到窗口句柄 const popup = originalOpen.apply(this, arguments); // 判断是否是你要调整的目标弹窗,比如按窗口名称匹配 if (popup && windowName === '你要匹配的弹窗的窗口名称') { // 等待弹窗加载完成后设置位置,可根据情况调整延迟 setTimeout(() => { // 直接设置到副屏的目标位置,比如主屏宽度1920的话,副屏左上角就是(1920, 0) popup.moveTo(1920, 0); // 也可以调整大小:popup.resizeTo(1920, 1080); }, 200); } return popup; }; })();
你只需要把脚本里的匹配规则和弹窗窗口名称替换成你实际场景的对应值即可,如果不知道弹窗的windowName,可以在原应用的window.open调用处打断点查看参数。
若弹窗域名和父页面域名不同源,父窗口无法获取弹窗操作权限,此时使用调整后的弹窗内脚本方案即可。
内容的提问来源于stack exchange,提问作者thecommexokid
相关产品推荐
相关产品推荐

