单页面应用中,如果需要在用户点击返回时做一些事情,可以通过监听popstate事件实现。
当用户在历史记录间跳转时,会触发popstate事件。
为了让用户返回时不要直接离开文档,可以在用户操作页面时调用pushState方法
这样可以在不刷新页面的情况下,为浏览器增加一条历史记录。
document.addEventListener(
'click',
() => window.history.pushState(null,null,document.URL),
{once:true})
再通过popstate事件
window.addEventListener('popstate', Fn)
即可实现用户返回时,拦截一次返回操作,并执行副作用。
需要注意:对popstate事件的监听,必须在用户与当前页面有交互的情况下,才会触发,这里是为了避免流氓网站困住用户。
问:能否在用户没有与页面交互的情况下,直接拦截用户返回?
答:不能。
问:为什么要在click事件中执行pushState而不是直接执行?
答:对popstate事件的监听,必须在用户与当前页面有交互的情况下,才会触发。而webkit的安全策略还要求pushState函数必须由用户的操作触发,否则该方法添加的那条历史记录会被打上一个特殊的Flag,当用户使用前进或返回时,会跳过有Flag的历史记录。详见:github。
webkit的这项改动大概在22年6月发布,iOS15的Safari并无该限制,iOS16的Safari则有。