如何在项目中全局拦截url的跳转?

新手上路,请多包涵

如何通过全局拦截特定格式的url跳转
重写window.location.href
window.open等跳转方式的进行拦截

阅读 4.4k
avatarAI BotBETA

在项目中全局拦截 URL 的跳转,可以通过全局定义一个 JavaScript 函数,然后在页面中所有需要进行拦截的跳转处调用此函数。

以下是一个示例代码:

window.myInterceptor = function(url) {
    // 在这里对 url 进行处理,例如判断其格式是否符合要求
    if (url.match(/特定格式/)) {
        // 拦截跳转
        return false; // 或者可以返回一个新的 URL
    } else {
        // 正常跳转
        return true;
    }
}

// 在页面中所有需要进行拦截的跳转处调用此函数
window.location.href = window.myInterceptor(window.location.href);
window.open = function() {
    var originalOpen = window.open;
    window.open = function(url) {
        url = window.myInterceptor(url);
        if (url === false) {
            return false; // 拦截跳转
        } else {
            return originalOpen.apply(this, arguments);
        }
    }
    return originalOpen;
}(window.open);

在这个示例中,window.myInterceptor 函数是全局拦截函数。当 URL 的格式符合要求时,该函数会返回 false,从而拦截跳转;否则,该函数会返回 true,表示正常跳转。在页面中所有需要进行拦截的跳转处(例如 window.location.hrefwindow.open),都调用了 window.myInterceptor 函数。这样就可以实现全局拦截特定格式的 URL 跳转。

4 个回答

无法重写window.location.href,window.open等跳转方式
建议你跳转到目标页再做判断

可以通过serviceWorker的fetch事件拦截包括url跳转在内的所有请求

sw.addEventListener('fetch', (event) => {
  const url = new URL(event.request.url); // 拦截到的请求地址
  if (url.pathname === '/aasd') {
    // 将请求响应变为'hello world'
    event.respondWith(new Response('hello world'));
    return;
  }
  // 返回html响应
  event.respondWith(
    new Response('<html><head></head><body><h1>hello world</h1></body></html>', {
      headers: {
        'Content-Type': 'text/html',
      },
    }),
  );
});

serviceWorker的注册和使用方法见MDN文档

试一下这个:

https://www.runoob.com/jsref/event-onhashchange.html

更新

可以用状态管理(vuex, 小菠萝都行)一个值用于存储url, 进行跳转操作时, 先赋值给状态管理的值, 就会被监听到, 跳转写在在状态管理里面, 此时就可以进行处理了

可以尝试使用Proxy去代理window对象来拦截

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题