请教一个页面跳转的监听问题 - V2EX
JCZ2MkKb5S8ZX9pq

请教一个页面跳转的监听问题

  •  
  •   JCZ2MkKb5S8ZX9pq Dec 10, 2019 3751 views
    This topic created in 2360 days ago, the information mentioned may be changed or developed.
    • js 问题,油猴脚本里用。
    • 比如 B 站任意一个视频
      [ 2019 年末音番] Best Artist 2019 全场 [猪猪]
    • 如果点击右侧的推荐视频,url 会变,window.location 也会更新,但是试了几种监听方式 hashchange 啥的都捕获不到这个页面变化。
    • 能想到的笨办法就是 setInterval 判断变化。
    • 想问问有没有更好的方法。
    gesse
        1
    gesse  
       Dec 10, 2019
    history.pushState
    cheeto
        2
    cheeto  
       Dec 10, 2019
    看看这篇文章 https://juejin.im/post/5c2708cd6fb9a049f06a5744
    也许对你有帮助
    JCZ2MkKb5S8ZX9pq
        3
    JCZ2MkKb5S8ZX9pq  
    OP
       Dec 10, 2019
    @gesse
    额,我搜了下,这个配套的 window.onpopstate,好像还是不行。
    codehz
        4
    codehz  
       Dec 10, 2019 via Android
    @JCZ2MkKb5S8ZX9pq 你可以 hook 掉 push state 的(
    JCZ2MkKb5S8ZX9pq
        5
    JCZ2MkKb5S8ZX9pq  
    OP
       Dec 10, 2019
    @cheeto 嗯,试下来是要用最后那个方法,可以监听到 pushstate。
    JCZ2MkKb5S8ZX9pq
        6
    JCZ2MkKb5S8ZX9pq  
    OP
       Dec 10, 2019
    @gesse
    @cheeto
    @codehz

    js 小白,不是很懂原理,但想请教新遇到的一个现象。
    let _wr = function(type) {
    let orig = history[type]
    return function() {
    let rv = orig.apply(this, arguments),
    e = new Event(type)
    e.arguments = arguments
    window.dispatchEvent(e)
    return rv
    }
    }
    history.pushState = _wr('pushState')
    window.addEventListener('pushState', function(e) {
    console.log(e)
    });

    先是用上面这个方法实现了监听。

    但是后来发现,如果在不同油猴脚本都调用同样的代码,会导致监听重复激活。
    于是就把_wr 传入的 type 名后面加了一个 uniqueId,就比如:
    history.pushState = _wr('pushState_scriptname')

    这样一来,好像在原本 pushState 的地方,页面像被刷新了一样,油猴脚本倒也重新被加载了,监听也就不用加了。

    不过不大明白原理,不知道各位高手能不能给说说。
    JCZ2MkKb5S8ZX9pq
        7
    JCZ2MkKb5S8ZX9pq  
    OP
       Dec 10, 2019
    是不是原本它是加了个事件以便于监听。
    但我给 history 加了一个非标准名称的新方法,然后导致了一些变化?
    codehz
        8
    codehz  
       Dec 10, 2019 via Android
    @JCZ2MkKb5S8ZX9pq 所以为啥要绕一圈发个事件,不能直接在 hook 处做你的逻辑么
    About     Help     Advertise     Blog     API     FAQ     Solana     2853 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 15:18 PVG 23:18 LAX 08:18 JFK 11:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86