- js 问题,油猴脚本里用。
- 比如 B 站任意一个视频
[ 2019 年末音番] Best Artist 2019 全场 [猪猪] - 如果点击右侧的推荐视频,url 会变,window.location 也会更新,但是试了几种监听方式 hashchange 啥的都捕获不到这个页面变化。
- 能想到的笨办法就是 setInterval 判断变化。
- 想问问有没有更好的方法。

1 gesse Dec 10, 2019 history.pushState |
2 cheeto Dec 10, 2019 看看这篇文章 https://juejin.im/post/5c2708cd6fb9a049f06a5744 也许对你有帮助 |
3 JCZ2MkKb5S8ZX9pq OP @gesse 额,我搜了下,这个配套的 window.onpopstate,好像还是不行。 |
4 codehz Dec 10, 2019 via Android @JCZ2MkKb5S8ZX9pq 你可以 hook 掉 push state 的( |
5 JCZ2MkKb5S8ZX9pq OP @cheeto 嗯,试下来是要用最后那个方法,可以监听到 pushstate。 |
6 JCZ2MkKb5S8ZX9pq OP @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 的地方,页面像被刷新了一样,油猴脚本倒也重新被加载了,监听也就不用加了。 不过不大明白原理,不知道各位高手能不能给说说。 |
7 JCZ2MkKb5S8ZX9pq OP 是不是原本它是加了个事件以便于监听。 但我给 history 加了一个非标准名称的新方法,然后导致了一些变化? |
8 codehz Dec 10, 2019 via Android @JCZ2MkKb5S8ZX9pq 所以为啥要绕一圈发个事件,不能直接在 hook 处做你的逻辑么 |