【问题标题】:How to capture browser's back/forward button click event or hash change event in javascript?如何在javascript中捕获浏览器的后退/前进按钮单击事件或哈希更改事件?
【发布时间】:2011-11-21 07:40:43
【问题描述】:

当点击浏览器的后退或前进按钮或在 javascript 中更改哈希时,我想alert()。我已经尝试过this 解决方案,它正在运行,但它会导致网页中的其他链接出现问题,并在任何链接点击事件上两次提交每个请求。

有什么解决方案可以在不使用setInterval() 函数的情况下捕获它?所以我需要捕捉 hash change 或 back/forward 按钮点击事件吗?我需要一个可以在所有现代浏览器中使用的简单 javascript 代码/函数/属性。

有什么办法吗?

谢谢

【问题讨论】:

  • 我正在使用 Ajax 并在每次调用 Ajax 请求时更新哈希。但是当我使用浏览器的后退/前进按钮后退/前进时,哈希会更改但页面不会更新。所以我想自己捕获这个事件并使用哈希 url 更新页面..

标签: javascript browser back forward


【解决方案1】:

不是个好主意

你能解释一下这背后的原因吗?我们都在防止后退/前进和类似情况以及浏览器功能损坏的道路上。

事实证明,最好服从浏览器并以这种方式编写应用程序,这样这些事情就变得无关紧要了。而且浏览器将越来越多的东西锁定到客户端 JavaScript 应用程序也是事实,因此您的应用程序很可能会在(少数)浏览器升级后失败。

使用 HTML5

HTML5 History spec 可能正是您所追求的。这是关于 Ajax 应用程序和浏览器的后退/前进功能的工作和完成方式。我建议你检查一下。看看working demo 做得很好。

【讨论】:

  • @RobertKoritnik 我没有看到管理哈希事件的不利之处,尤其是当您拥有 ajax 应用程序时。实际上,您最好向浏览器发出信号,表明您正在使用哈希事件和指向该状态的 url 更改状态。
  • 这是 W3C HTML5 历史规范http://www.w3.org/TR/html5/browsers.html#history的新链接
【解决方案2】:

我相信这就是 Robert Koritnik 正在寻找的答案,我在这里找到了它:https://developers.google.com/tv/web/articles/location-hash-navigation

有一个事件 (window.onhashchange) 会在位置散列更新或更改时触发,因此您所要做的就是使用 JavaScript 设置一个事件处理程序来侦听此事件并根据散列执行代码。基本上是这样完成的:

function getLocationHash() {
  return window.location.hash.substring(1);
}
window.onhashchange = function(e) {
  switch(getLocationHash()) {
    case 'state1': 
      execute code block 1;
      break;
    case 'state2':
      execute code block 2;
      break;
    default: 
      code to be executed if different from case 1 and 2;
  }
}

我在我的网站上运行它: http://www.designhandler.com

这都是动态变化的内容。还没有ajax,但是当我完成时它会。我仍然使用 window.location.hash 来跟踪站点状态。如果您浏览网站,然后在网站进入历史记录后开始使用后退按钮进行导航,它将动态更改状态,就像用户实际点击导航一样,而不是之后需要重新加载页面。

【讨论】:

    【解决方案3】:

    这是用于散列还是用于重定向?你想做什么?这种行为通常具有很强的侵入性。

    您可能想为此 javascript before leaving the page 尝试“onbeforeunload”事件


    已编辑

    其实你提供的链接还是挺准确的。

    var hash = location.hash;
    
    setInterval(function()
    {
       if (location.hash != hash)
       {
           hashUpdatedEvent(hash);
       }
    }, 100);
    
    function hashUpdatedEvent(hash)
    {
         switch(...);
    }
    

    如果您更改,您的链接重复操作问题将得到纠正

    <a href="javascript:void(0)" onclick="someFuncion()">Go for it</a>
    
    function someFuncion()
    {
       doWhatever();
       location.hash = 'somethingwasdone';
    }
    
    function hashUpdatedEvent(hash)
    {
         if(hash == 'somethingwasdone')
         {
             doWhatever();
         }
    }
    

    只需(更新哈希并让“事件”处理操作):

    <a href="javascript:void(0)" onclick="someFuncion()">Go for it</a>
    
    function someFuncion()
    {
       location.hash = 'somethingwasdone';
    }
    
    function hashUpdatedEvent(hash)
    {
         if(hash == 'somethingwasdone')
         {
             doWhatever();
         }
    }
    

    【讨论】:

    • 我正在使用 Ajax 并在每次调用 Ajax 请求时更新哈希。但是当我使用浏览器的后退/前进按钮后退/前进时,哈希会更改但页面不会更新。所以我想自己捕获这个事件并使用哈希 url 更新页面..
    【解决方案4】:

    Javascript 提供事件popstate 来捕获浏览器的后退/前进按钮点击事件 -

    window.addEventListener("popstate", function(e) { 
      // if a back or forward button is clicked, do whatever, like alert or anything
    
      console.log('href => ', e.path[0].location.href);
      // href =>  https://testdomain.com/demos/material/admin-app/#!/app/dashboard
    
      console.log('hash => ', e.path[0].location.hash);
      //hash =>  #!/app/dashboard
    
      console.log('pathname => ', e.path[0].location.pathname);
      //pathname =>  /demos/material/admin-app/
    
    });
    

    阅读更多popstate

    【讨论】:

      猜你喜欢
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 2014-04-28
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多