跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • js 如何拦截 location.href,让页面的 location.href 都失效或者可以自定义跳转到其他页面?
未分類
13 1 月 2021

js 如何拦截 location.href,让页面的 location.href 都失效或者可以自定义跳转到其他页面?

js 如何拦截 location.href,让页面的 location.href 都失效或者可以自定义跳转到其他页面?

資深大佬 : zictos 4

alert()和 window.open()都可以拦截,只需要重新赋值即可,比如添加一行 alert=0,那么所有的 alert 就失效了。甚至可以自定义只拦截包括某些字符串的 alert 对话框,具体可以搜索“js 拦截 alert”。

html 的 a 标签也可以拦截, 具体可以搜索“js 阻止 a 标签跳转”。

但是 location.href 是一个属性,只要修改属性就会触发页面跳转,设置为任何值都无法让它失效。并且 href 属性也无法删除。难道没其他办法了呢?或者能不能获取到 location.href 这个事件并拦截,然后再自定义做自己想做的事。

大佬有話說 (24)

  • 資深大佬 : cjd6568358

    Object.defineProperty

  • 資深大佬 : ho121

    把 location 干掉?

  • 資深大佬 : KuroNekoFan

    ….为什么要在 very bad practise 的路上渐行渐远呢

  • 資深大佬 : musi

    具体可以搜索“js proxy”

  • 資深大佬 : weixiangzhe

    我查一了 proxy,貌似也是不行 https://stackoverflow.com/questions/45965893/how-do-i-apply-get-proxy-on-window-location-in-javascript
    ——————
    关注一下,可以整 就可以写个油猴脚本,在手机上阻止部分网页打开 app 了

  • 主 資深大佬 : zictos

    @weixiangzhe #5 其实我就是想阻止手机上打开 app,比如手机网页打开淘宝一般是用下面的代码:
    window.location.href = ‘taobao://m.taobao.com’

    taobao://是淘宝注册的 scheme,所以会打开淘宝,后面的 m.taobao.com 就是要打开的网页地址,如果输入 taobao://detail.tmall.com/item.htm?id=616270509106 就会打开一个天猫的服装商品页面

  • 資深大佬 : zjm947373

    一正解

  • 資深大佬 : weixiangzhe

    @zictos

  • 資深大佬 : Quarter

    可以重新给 window.location 赋值么,不太清楚

  • 主 資深大佬 : zictos

    @Quarter #9 不能, 给 window.location 赋值也是默认会直接跳转, 跟 window.location.href 的效果是一样的。况且如果整个 window.location 都不能用了,对整个网页的影响会比较大

  • 資深大佬 : mxT52CRuqR6o5

    @zjm947373
    @cjd6568358
    并不行
    Cannot redefine property

  • 資深大佬 : rekulas

    干掉也能恢复
    var i = document.createElement(‘iframe’);
    i.style.display = ‘none’;
    document.body.appendChild(i);
    window.alert = i.contentWindow.alert;

    这只是其中一种手段
    除非你把大部分函数都禁了 不然总有办法

  • 資深大佬 : sleepm

    js Service Worker fetch event

  • 資深大佬 : no1xsyzy

    https://stackoverflow.com/a/35558822/6202760 都不行
    但是你可以通过 onbeforeunload 来阻止跳转
    https://stackoverflow.com/a/2647601/6202760
    虽然

  • 資深大佬 : no1xsyzy

    @no1xsyzy 虽然我不清楚这种不发生页面跳转的是否会生效……

    @sleepm fetch event 不能阻止自定义 scheme,除非你想替换页面上的每一个 js

  • 主 資深大佬 : zictos

    @cjd6568358 #1
    defineProperty 可以修改 userAgent, 但是不能修改 location.href, 提示 Cannot redefine property: href

    下面是修改 userAgent 的代码, 修改后 userAgent 字符串就变成”new_ua”了:
    Object.defineProperty(navigator, ‘userAgent’, {
    value: ‘new_ua’,
    writable: false
    });
    console.log(navigator.userAgent);

  • 資深大佬 : zjsxwc

    js 做不到,只能在浏览器层面搞,比如安卓 webview 有 shouldOverrideUrlLoading 来处理

    https://stackoverflow.com/questions/16669046/android-webview-shouldoverrideurlloading-method

  • 資深大佬 : azcvcza

    在浏览器里的 js 是有极限的,例如没办法在 onbeforeunload 里去阻塞关闭

  • 資深大佬 : ciqulover

    对于 window.location 你想任何方式 re-define property 都是不可能的,这个对象你用页面同等级的 js 动不了他分毫。
    不过如果是浏览器插件就可以,如果目标脚本是异步加载,可以直接劫持掉请求,如果内联 script 就用 MutationObserver 。
    4 说的 jsproxy 可以参考一下。

  • 主 資深大佬 : zictos

    @rekulas #12 如果很少有人去禁用的话, 那网站开发者在写 js 的时候就根本不会考虑 alert 被禁用的情况。虽然不能保证 100%的网站都有效,起码也可以保证 99%的网站有效

  • 資深大佬 : sleepm

    document.addEventListener(‘click’, function(event) {
    target = event.target;
    if(target.nodeName == “A”){
    event.preventDefault();
    }else{
    console.log(target.nodeName);
    }
    });
    粗暴..

  • 資深大佬 : JKKK

    Proxy

  • 資深大佬 : ysc3839

    这个问题应该从浏览器层面解决的。但不知道为什么 Chrome 有打开外部程序前提示的功能,却不给 Chrome Android 启用。
    顺便吐槽一下,Chrome Android 给人感觉问题很多,经常出现卡死的情况,不是说浏览器已经是多进程模型,标签页出现问题不会导致整个程序卡死了吗?

  • 資深大佬 : shenyuzhi

    浏览器 api 不是普通的 js 对象。不建议做骚操作。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具