You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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变化场景:

  1. 用URL对象处理参数,避免重复添加或拼接错误
  2. 拦截历史记录API,捕获SPA内部跳转的URL变化
  3. 监听浏览器前进后退事件,处理手动路由切换

完整脚本

// ==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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 16:57:23