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

2019-12-10 13:23:51 +08:00
 JCZ2MkKb5S8ZX9pq
3197 次点击
所在节点    JavaScript
8 条回复
gesse
2019-12-10 13:32:03 +08:00
history.pushState
cheeto
2019-12-10 13:37:44 +08:00
看看这篇文章 https://juejin.im/post/5c2708cd6fb9a049f06a5744
也许对你有帮助
JCZ2MkKb5S8ZX9pq
2019-12-10 13:40:10 +08:00
@gesse
额,我搜了下,这个配套的 window.onpopstate,好像还是不行。
codehz
2019-12-10 13:42:39 +08:00
@JCZ2MkKb5S8ZX9pq 你可以 hook 掉 push state 的(
JCZ2MkKb5S8ZX9pq
2019-12-10 13:43:50 +08:00
@cheeto 嗯,试下来是要用最后那个方法,可以监听到 pushstate。
JCZ2MkKb5S8ZX9pq
2019-12-10 20:54:58 +08:00
@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
2019-12-10 21:06:36 +08:00
是不是原本它是加了个事件以便于监听。
但我给 history 加了一个非标准名称的新方法,然后导致了一些变化?
codehz
2019-12-10 21:48:12 +08:00
@JCZ2MkKb5S8ZX9pq 所以为啥要绕一圈发个事件,不能直接在 hook 处做你的逻辑么

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/627589

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX