推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
zictos

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

  •  
  •   zictos · Jan 29, 2021 · 7474 views
    This topic created in 2109 days ago, the information mentioned may be changed or developed.
    alert()和 window.open()都可以拦截,只需要重新赋值即可,比如添加一行 alert=0,那么所有的 alert 就失效了。甚至可以自定义只拦截包括某些字符串的 alert 对话框,具体可以搜索“js 拦截 alert”。

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

    但是 location.href 是一个属性,只要修改属性就会触发页面跳转,设置为任何值都无法让它失效。并且 href 属性也无法删除。难道没其他办法了呢?或者能不能获取到 location.href 这个事件并拦截,然后再自定义做自己想做的事。
    26 replies  •  2021-02-05 18:40:00 +08:00
    cjd6568358
    cjd6568358
    Jan 29, 2021
    1
    Object.defineProperty
    ho121
    ho121
    Jan 29, 2021 via Android
    2
    把 location 干掉?
    KuroNekoFan
    KuroNekoFan
    Jan 29, 2021
    3
    ....为什么要在 very bad practise 的路上渐行渐远呢
    musi
    musi
    Jan 29, 2021
    4
    具体可以搜索“js proxy”
    weixiangzhe
    weixiangzhe
    Jan 29, 2021
    5
    我查一了 proxy,貌似也是不行 https://stackoverflow.com/questions/45965893/how-do-i-apply-get-proxy-on-window-location-in-javascript
    ——————
    关注一下,可以整 就可以写个油猴脚本,在手机上阻止部分网页打开 app 了
    zictos
    zictos
    OP
    Jan 29, 2021
    6
    @weixiangzhe #5 其实我就是想阻止手机上打开 app,比如手机网页打开淘宝一般是用下面的代码:
    window.location.href = 'taobao://m.taobao.com'

    taobao://是淘宝注册的 scheme,所以会打开淘宝,后面的 m.taobao.com 就是要打开的网页地址,如果输入 taobao://detail.tmall.com/item.htm?id=616270509106 就会打开一个天猫的服装商品页面
    zjm947373
    zjm947373
    Jan 29, 2021
    7
    一楼正解
    weixiangzhe
    weixiangzhe
    Jan 29, 2021
    8
    @zictos 😂 , 我之前找了一下,貌似没有整,看看楼下怎么说吧,不过现在还有 universal link, schema 是 https 的
    Quarter
    Quarter
    Jan 29, 2021 via iPhone
    9
    可以重新给 window.location 赋值么,不太清楚😪
    zictos
    zictos
    OP
    Jan 29, 2021
    10
    @Quarter #9 不能, 给 window.location 赋值也是默认会直接跳转, 跟 window.location.href 的效果是一样的。况且如果整个 window.location 都不能用了,对整个网页的影响会比较大
    mxT52CRuqR6o5
    mxT52CRuqR6o5
    Jan 29, 2021
    11
    @zjm947373
    @cjd6568358
    并不行
    Cannot redefine property
    rekulas
    rekulas
    Jan 29, 2021
    12
    干掉也能恢复
    var i = document.createElement('iframe');
    i.style.display = 'none';
    document.body.appendChild(i);
    window.alert = i.contentWindow.alert;

    这只是其中一种手段
    除非你把大部分函数都禁了 不然总有办法
    sleepm
    sleepm
    Jan 29, 2021
    13
    js Service Worker fetch event
    no1xsyzy
    no1xsyzy
    Jan 29, 2021
    14
    https://stackoverflow.com/a/35558822/6202760 都不行
    但是你可以通过 onbeforeunload 来阻止跳转
    https://stackoverflow.com/a/2647601/6202760
    虽然
    no1xsyzy
    no1xsyzy
    Jan 29, 2021
    15
    @no1xsyzy 虽然我不清楚这种不发生页面跳转的是否会生效……

    @sleepm fetch event 不能阻止自定义 scheme,除非你想替换页面上的每一个 js
    zictos
    zictos
    OP
    Jan 29, 2021
    16
    @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
    zjsxwc
    Jan 29, 2021
    17
    js 做不到,只能在浏览器层面搞,比如安卓 webview 有 shouldOverrideUrlLoading 来处理

    https://stackoverflow.com/questions/16669046/android-webview-shouldoverrideurlloading-method
    azcvcza
    azcvcza
    Jan 29, 2021
    18
    在浏览器里的 js 是有极限的,例如没办法在 onbeforeunload 里去阻塞关闭
    ciqulover
    ciqulover
    Jan 29, 2021 via iPhone
    19
    对于 window.location 你想任何方式 re-define property 都是不可能的,这个对象你用页面同等级的 js 动不了他分毫。
    不过如果是浏览器插件就可以,如果目标脚本是异步加载,可以直接劫持掉请求,如果内联 script 就用 MutationObserver 。
    4 楼说的 jsproxy 可以参考一下。
    zictos
    zictos
    OP
    Jan 29, 2021
    20
    @rekulas #12 如果很少有人去禁用的话, 那网站开发者在写 js 的时候就根本不会考虑 alert 被禁用的情况。虽然不能保证 100%的网站都有效,起码也可以保证 99%的网站有效
    sleepm
    sleepm
    Jan 29, 2021
    21
    document.addEventListener('click', function(event) {
    target = event.target;
    if(target.nodeName == "A"){
    event.preventDefault();
    }else{
    console.log(target.nodeName);
    }
    });
    粗暴..
    poly1911
    poly1911
    Jan 29, 2021
    22
    Proxy
    ysc3839
    ysc3839
    Jan 29, 2021
    23
    这个问题应该从浏览器层面解决的。但不知道为什么 Chrome 有打开外部程序前提示的功能,却不给 Chrome Android 启用。
    顺便吐槽一下,Chrome Android 给人感觉问题很多,经常出现卡死的情况,不是说浏览器已经是多进程模型,标签页出现问题不会导致整个程序卡死了吗?
    shenyuzhi
    shenyuzhi
    Jan 29, 2021 via iPhone
    24
    浏览器 api 不是普通的 js 对象。不建议做骚操作。
    anson2017
    anson2017
    Feb 5, 2021
    25
    window.location.href = null
    zictos
    zictos
    OP
    Feb 5, 2021
    26
    @anson2017 #25 不行,会跳转到当前页面所在路径下的 null 页面,是一个不存在的页面
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   669 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 67ms · UTC 18:15 · PVG 02:15 · LAX 10:15 · JFK 13:15
    ♥ Do have faith in what you're doing.