Firemonkey脚本无法检测部分页面(如Facebook)的URL变化求助
解决Firemonkey下Facebook SPA路由变化时的重定向问题
你的核心问题是Facebook这类单页应用(SPA)的内部跳转不会触发Userscript重新执行——因为页面没有刷新,@run-at document-start仅在初始加载时生效。原脚本存在两个关键问题:
window.onpopstate = fireRedirect()是直接调用函数并将返回值绑定到事件,正确写法应为绑定函数引用- 监听title的MutationObserver不可靠,部分SPA场景下title变化可能滞后或不触发
优化方案
通过拦截history.pushState和history.replaceState方法(SPA路由变化的核心API),结合popstate事件监听,覆盖所有URL变化场景:
- 用
URL对象处理参数,避免重复添加或拼接错误 - 拦截历史记录API,捕获SPA内部跳转的URL变化
- 监听浏览器前进后退事件,处理手动路由切换
完整脚本
// ==UserScript== // @name Redirect // @match https://www.facebook.com/groups/* // @exclude https://www.facebook.com/groups/*/*/ // @run-at document-start // ==/UserScript== function fireRedirect() { const currentUrl = new URL(window.location.href); // 检查是否已存在目标参数 if (!currentUrl.searchParams.has('sorting_setting')) { currentUrl.searchParams.set('sorting_setting', 'CHRONOLOGICAL'); // 避免无限循环,仅在URL不同时跳转 if (currentUrl.toString() !== window.location.href) { window.location.href = currentUrl.toString(); } } } // 监听浏览器前进后退事件 window.addEventListener('popstate', fireRedirect); // 拦截history.pushState,捕获SPA跳转 const originalPushState = history.pushState; history.pushState = function(...args) { const result = originalPushState.apply(this, args); fireRedirect(); return result; }; // 拦截history.replaceState,捕获SPA跳转 const originalReplaceState = history.replaceState; history.replaceState = function(...args) { const result = originalReplaceState.apply(this, args); fireRedirect(); return result; }; // 初始加载时执行一次 fireRedirect();
关键说明
URL对象自动处理参数拼接逻辑,无需手动判断?或&,避免参数重复添加- 拦截
history的两个核心方法,覆盖所有SPA主动修改URL的场景 - 添加URL比对逻辑,防止参数已存在时触发不必要的跳转循环
内容的提问来源于stack exchange,提问作者ETL
相关产品推荐
相关产品推荐

