收藏
回答

Android设备微信 history.pushState 问题

框架类型 问题类型 操作系统 操作系统版本 手机型号 微信版本
小程序 Bug Android Android 4.4 Nokia X71 7.0.15

这个是在微信浏览器中的问题

你们的框架类型只能选择小程序 或 小游戏,公众号都不能选


场景1:初始直接调用 history.pushState 改变url

  1. url 改变不生效,无法监听 popstate。
  2. url 改变生效,无法监听 popstate。
  3. 点击按钮获取 history.state,又可以监听 popstate。

场景1:点击按钮,调用 history.pushState 改变url

  1. url 改变,可以监听 popstate。

结论

  1. 必须事件触发 history.state 相关事件,才能监听 popstate。
<!DOCTYPE html>
<html lang="en">


<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>pushState</title>
</head>


<body>
  <p><button id="urlBtn">获取 url</button></p>
  <p><button id="stateBtn">获取 history.state</button></p>
  <p><button id="pushStateBtn">设置 history.pushState</button></p>


  <script>
    var state0 = {
      title: '#',
      url: '#route0'
    }
    history.pushState(state0, state0.title, state0.url) //这个时候点返回正常应该不会退出页面,但是Android上退出了



    document.getElementById('urlBtn').addEventListener('click', function () {
      alert(location.href) //触发一次, route0生效,点返回不会退出页面
    }, false)


    document.getElementById('stateBtn').addEventListener('click', function () {
      alert(JSON.stringify(history.state)) //触发一次, route0生效,点返回不会退出页面
    }, false)


    document.getElementById('pushStateBtn').addEventListener('click', function () {
      var state1 = {
        title: '#',
        url: '#route1'
      }
      history.pushState(state1, state1.title, state1.url) //触发一次,route0,route1生效, 点返回不会退出页面,
    }, false)


  </script>
</body>


</html>


回答关注问题邀请回答
收藏

1 个回答

  • XieSH
    XieSH
    2021-05-06

    经过我自己的测试,原因并不是必须要事件触发history.state事件才能监听popstate,而是只要与页面产生了交互就可以触发,前提是必须产生交互,比如说只要点击一下屏幕,就可以监听了

    2021-05-06
    有用 4
    回复 3
    • Davon
      Davon
      2022-08-31
      请问怎么样才能默认产生一次交互?
      2022-08-31
      回复
    • 安好
      安好
      2022-12-01回复Davon
      请问解决了吗
      2022-12-01
      回复
    • 晴雨
      晴雨
      2022-12-02回复安好
      没啥好办法,我发现手机震动navigator.vibrate和这一个毛病
      2022-12-02
      回复
登录 后发表内容
问题标签