首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Chrome 77中不能监听'popstate‘事件?

在Chrome 77中,popstate事件是可以正常监听的。如果你遇到了无法监听popstate事件的问题,可能是由于以下几个原因导致的:

基础概念

popstate事件是在浏览器的历史记录条目发生变化时触发的。这个事件通常与window.history API一起使用,特别是在单页应用(SPA)中,用于处理浏览器的前进和后退按钮操作。

可能的原因及解决方法

  1. 事件监听器未正确绑定: 确保你在正确的时机绑定了popstate事件监听器。通常应该在页面加载完成后绑定。
  2. 事件监听器未正确绑定: 确保你在正确的时机绑定了popstate事件监听器。通常应该在页面加载完成后绑定。
  3. 历史记录未正确更新: 如果你在代码中使用了history.pushState()history.replaceState(),但没有正确地更新历史记录,那么popstate事件可能不会触发。
  4. 历史记录未正确更新: 如果你在代码中使用了history.pushState()history.replaceState(),但没有正确地更新历史记录,那么popstate事件可能不会触发。
  5. 事件被其他代码阻止: 检查是否有其他脚本或代码阻止了事件的传播。
  6. 浏览器扩展或插件干扰: 某些浏览器扩展可能会干扰正常的事件处理。尝试在无痕模式下打开页面,看是否能复现问题。
  7. Chrome版本特定问题: 尽管Chrome 77应该支持popstate事件,但可能存在某些未知的bug。可以尝试更新到最新版本的Chrome,或者查找相关的bug报告。

示例代码

以下是一个简单的示例,展示了如何正确地监听popstate事件:

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Popstate Example</title>
</head>
<body>
    <button onclick="changeState()">Change State</button>
    <script>
        window.addEventListener('load', function() {
            window.addEventListener('popstate', function(event) {
                console.log('Location: ' + document.location + ', State: ' + JSON.stringify(event.state));
            });
        });

        function changeState() {
            var stateObj = { foo: "bar" };
            history.pushState(stateObj, "page 2", "?page=2");
        }
    </script>
</body>
</html>

在这个示例中,点击按钮会改变浏览器的历史记录,并且当你点击浏览器的前进或后退按钮时,popstate事件会被触发。

总结

确保你在页面加载完成后绑定popstate事件监听器,并且正确地使用history.pushState()history.replaceState()来更新历史记录。如果问题依旧存在,考虑检查是否有其他脚本干扰或尝试在不同的浏览器环境中测试。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Browser 对象(一、history)

    但是他会出现一个很严重的问题(由于页面没有重新加载,浏览器URL历史中在每次下一页后是不会新添加的URL,因为只是局部刷新,所以不会添加新的URL,这就导致了,浏览器的返回上一页功能不能使用),pushState...事件在window对象上的事件处理程序....每当处于激活状态的历史记录条目发生变化时,popstate事件就会在对应window对象上触发....调用history.pushState()或者history.replaceState()不会触发popstate事件. popstate事件只会在浏览器某些行为下触发, 比如点击后退、前进按钮(或者在...当网页加载时,各浏览器对popstate事件是否触发有不同的表现,Chrome 和 Safari会触发popstate事件, 而Firefox不会.

    92610

    【前端监控】单页应用首屏测速

    所以如果我们想对 spa 完成 pv、首屏测速,我们就只能去监听切换事件,在事件回调里面完成上报 1基本原理 我们监听 spa 切换用到的事件是 onpopstate,当浏览器的历史记录发生变化的时候在...替代 popstate 事件 并不能用 hashChange 替代 popstate 事件,比较的主要有几点。...因为我们需要在 事件回调中完成首屏测速,所以需要监听 DOM 加载,所以事件触发越快,越能保证DOM 加载监听动作。...我们主要在重写方法里触发了自定义的事件 pushState 和 replaceState 只是为了监听到这两个行为,而监听他们也是为了完成和 popstate 同样的事情 所以监听就变成 function...浏览器通常存储有限,比如 Chrome 只会存储250个,超过后的新资源可能无法被记录! 这样就会导致我们无法获取到新的 img 加载时间。

    1.8K30

    捕获用户在该页面停留的时长,我是这样做的(前端监测)

    在监测功能的时候,我们首要考虑的就是,我们的监测代码不能影响我们现在的业务代码,和以后的业务代码。 多页面应用 在多页面应用,要获取用户的停留时间还是挺简单的,看看下面几个Api?...browserHistory 单页面的browserHistory路由是基于H5的History API实现的,我们只要监听popstate就可以知道,点击前进后退按钮改变的url变化,表url发生变化...,那我们就统计不了用户待在该页面的时长的了;可是解决方法还是有的,只需要重写pushState和replaceState,然后监听两个自定义事件就行,看下面代码?..., pushstate事件是在rewriteHis时注册的,不是原生事件 // 当点击router-link 或者 window.history.pushState 或者 this....$router.push 时都会被该事件监听到 window.addEventListener('pushstate',()=>{}) // 监听自定义事件, replacestate事件是在rewriteHis

    4.1K41

    使用react-hooks在事件监听中state不更新问题

    2021-04-21 16:56:43 在使用react开发网站时,使用事件监听是常有的事情,但是有时候你会发现一个问题,就是这个state有时候不更新,始终是一个值,让人很是费解。...count值,但是监听事件中拿不到呢?...document.removeEventListener('scroll', scrollEventListener) } },[count]); 但是个人不建议这么做,因为如果是其依赖的数据过多,最造成频繁增加监听事件和解除监听事件...) },[count]); 这个例子比较简单,通常情况下遇到多种变量,我们可以在监听事件中使用setCount,对于count变化后具体的执行放在useEffect中即可。...,需要在初次生成组件时生成编辑器对象,而且只在初次时生成,内部需要在内容修改是调用父组件的onChange事件,为了简化使用上面的例子也能看出效果。

    7.2K30

    单页面应用history路由实现原理

    无论什么时候用户导航到新的状态,popstate事件就会被触发,能触发popstate事件的是history.back()或history.forword()以及history.go(),pushState...()是不会触发的,后面会介绍如何监听pushState事件。...popstate事件 每当活动的历史记录项发生变化时, popstate 事件都会被传递给window对象。...那么当页面重新加载时,页面会接收一个onload事件,但没有 popstate 事件。然而,假如你读取了history.state属性,你将会得到如同popstate 被触发时能得到的状态对象。...popstate事件,这个事件无法监听pushState和replaceState事件,有一个很笨的方式就是采用setInterval轮询的方式来判断history.state是否变化来判断url是否变化

    3.3K10

    前端面试题锦集:第二期

    $destory() ---> beforeDestroy ---> 销毁watcher,子组件,及事件监听 ---> 销毁完成。 计算属性 模板内的表达式非常便利。但是初衷是用于简单运算。...但其实除了hashChange事件外,还有一个popstate事件。 当活动历史记录条目更改时,将触发popstate事件。...需要注意的是调用history.pushState()或history.replaceState()不会触发popstate事件。...只有在做出浏览器动作时,才会触发该事件,如用户点击浏览器的回退按钮(或者在Javascript代码中调用history.back()或者history.forward()方法)。...不同的浏览器在加载页面时处理popstate事件的形式存在差异。页面加载时Chrome和Safari通常会触发(emit )popstate事件,但Firefox则不会。

    1.5K20

    从 Prompt 来看微前端路由劫持原理

    这个方法做了两件事: 监听全局 popstate 事件 订阅 history 变化 这样,每当通过 history.push 或浏览器的前进后退变化路由(或触发 popstate 事件),从而动态渲染对应的页面组件...popstate 和 hashChange 事件,并根据当前 URL 动态渲染匹配成功的微应用。...因此,icestark 在解决这个问题的过程中,是通过劫持所有对 popstate 事件的监听,并在路由变化后主动触发 所有 popstate 的监听器。...') { // 劫持 popstate 的监听器 popstateCapturedListeners.push(fn); } } }; // 执行捕获的 popstate...也就是:当微应用内部执行 history.push 时,微应用挂载的popstate 的监听器就会重复执行一次。 目前来说,这是一个预期的行为。

    98610

    从 Prompt 来看微前端路由劫持原理

    这个方法做了两件事: 监听全局 popstate 事件 订阅 history 变化 这样,每当通过 history.push 或浏览器的前进后退变化路由(或触发 popstate 事件),从而动态渲染对应的页面组件...popstate 和 hashChange 事件,并根据当前 URL 动态渲染匹配成功的微应用。...因此,icestark 在解决这个问题的过程中,是通过劫持所有对 popstate 事件的监听,并在路由变化后主动触发 所有 popstate 的监听器。...') { // 劫持 popstate 的监听器 popstateCapturedListeners.push(fn); } } }; // 执行捕获的 popstate...也就是:当微应用内部执行 history.push 时,微应用挂载的popstate 的监听器就会重复执行一次。 目前来说,这是一个预期的行为。

    1.4K30

    大前端开发中的路由管理之二:web篇

    IE8+、Firefox 3.6+、Chrome 5+、Safari 4.0+支持该事件。...回顾hash模式,在hash被改变时会触发hashchange事件,而window上也有一个popstate事件。当活动历史记录条目更改时,将触发popstate事件。...然而调用history.pushState()/history.replaceState()不会触发popstate事件,只有在做出浏览器动作时,才会触发该事件,比如用户点击浏览器的回退/前进按钮,或者在...既然pushState和replaceState不会触发事件,那么我们需要换个思路来监听URL的变化。在单页应用中能改变URL的操作其实可以归为以下几种:         1....核心功能的简单实现如下:         首先创建一个router对象,并添加popstate事件监听, class HistoryRouter

    1.6K20

    前端路由的原理及应用

    我们给window绑定监听事件,监听hashchange事件,当url中的hash值改变时,刷新页面展示对应的内容。...但是在低版本浏览器中并不兼容hashchange事件,需要通过轮询监听url的变化,来检测hash的变化,下面是一段魔力的代码: (function(window) { // 如果浏览器不支持原生实现的事件...pushState()和replaceState() 在html5之前,浏览器的历史记录是不能被操作的,开发者只能调用 history 对象的几种方法来实现简单的跳转,比如back、go、forward...这时 popstate 就要登场了。 window.onpopstate 是 popstate 事件在window对象上的事件处理程序....当网页加载时,各浏览器对popstate事件是否触发有不同的表现,Chrome 和 Safari会触发popstate事件, 而Firefox不会.

    2.3K20

    前端路由实现方式

    一般是基于前后端没有分离的项目,html和数据绑定发生在后端(后端渲染),有利于SEO,因为每次发送请求都需要获取资源,对服务器造成资源浪费,前端页面可能因为网速造成延迟,页面局部视图更新,ajax请求不同保存当前的请求状态,不能使用浏览器前进后退快捷键操作...(SPA)开发中,通过Hash可以实现前端路由,hash路由形如:http:localhost:8100/#/home, 在url后缀存在#(锚点),用来做页面定位,即根据页面id将该元素所在的区域展示在可视区域...页面hash值可以通过 window.location.hash 属性获取,当url的hash值发生变化,会触发window对象的hashchange事件,通过监听 hashchange 事件,操作 window.location.hash...//浏览器历史记录压栈,增加一条历史记录 History.replaceState() //浏览器历史记录最后一条数据更新,替换当前历史记录 操作pushState和replaceState方法会触发popstate...事件,页面刷新不同浏览器事件监听存在差异,Chrome和Safari会触发popstate事件,Firefox不会触发。

    61710

    精读《react-snippets - Router 源码》

    popstate 事件,该事件由用户点击浏览器前进/后退时触发 window.addEventListener('popstate', onLocationChange); return...既然 Router 已经监听 popstate 事件,我们显然想到的是触发 url 变化后,让 popstate 捕获,自动触发后续跳转逻辑。...但可惜的是,我们要做的 React Router 需要实现单页跳转逻辑,而单页跳转的 API history.pushState 并不会触发 popstate,为了让实现更优雅,我们可以在 pushState...比如 pushState 无法触发 popstate 那段,直接把 popstate 代码复用过来,或者自己造一个状态沟通就太 low 了,用浏览器 API 模拟事件触发,既轻量,又符合逻辑,因为你要做的就是触发...popstate 行为,而非只是更新渲染组件这个动作,万一以后再有监听 popstate 的地方,你的触发逻辑就能很自然的应用到那儿。

    41810

    你好,谈谈你对前端路由的理解

    哈希模式 a 标签锚点大家应该不陌生,而浏览器地址上 # 后面的变化,是可以被监听的,浏览器为我们提供了原生监听事件 hashchange ,它可以监听到如下的变化: 点击 a 标签,改变了浏览器地址...()或history.replaceState()不会触发popstate事件。...包括 a 标签的点击事件也是不会被 popstate 监听。我们需要想个办法解决这个问题,才能实现 history 模式。...解决思路: 我们可以通过遍历页面上的所有 a 标签,阻止 a 标签的默认事件的同时,加上点击事件的回调函数,在回调函数内获取 a 标签的 href 属性值,再通过 pushState 去改变浏览器的 location.pathname...然后手动执行 popstate 事件的回调函数,去匹配相应的路由。逻辑上可能有些饶,我们用代码来解释一下:在线地址 <!

    98920

    hash和history路由模式

    SPA可以监听hashchange事件,在URL的hash部分变化时根据定义好的路由映射关系来动态渲染内容。...使用hashchange事件来监听 URL 的变化,以下这几种情况改变 URL 都会触发 hashchange 事件:浏览器前进后退改变 URL、标签改变 URL、window.location改变...SPA可以监听popstate事件来响应浏览器前进、后退操作。...事件,但 popstate 事件有些不同:通过浏览器前进后退改变 URL 时会触发 popstate 事件,通过pushState/replaceState或标签改变 URL 不会触发 popstate...能不能有一种方法,可以在不向服务器发送请求的条件下,改变浏览器的 URL,以此来实现“多页面”概念? 答案是有,Vue Router 就是官方开发的一个插件,专门来做这件事。

    22410
    领券