bootstrap 3关闭模式按下浏览器后退按钮

时间:2016-10-28 23:37:47

标签: jquery bootstrap-modal browser-history

我只想创建一个模态页面,其行为相同,要么使用bootstrap 3按下浏览器后退按钮或模式内的关闭按钮。我找到了一个脚本来执行此操作,但是存在问题。让我们说我开始使用google.com,转到这个模态页面,然后按下" Modal!"按钮,然后按下浏览器后退按钮,它将关闭模式,如果我再次按下后退按钮,它将带我回google.com(一切都很好)。但是这次,如果我打开模态页面并使用"关闭"关闭模态。而是按钮。但现在,我必须按两次后退按钮才能返回google.com。如果我用模态内的关闭按钮打开和关闭模态,如10x。我发现我必须再次按下浏览器10按钮才能返回google.com页面。如何解决这个问题? TIA

<!--html, bootstrap 3.2.0-->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
  <div class="modal-body">
    <p>If you press the web browser's back button not the modal's "close" button, the modal will close and the hash "#myModal" will be removed for the URL</p>
  </div>
  <div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">Close</button></div>
</div>
</div>
</div>

<!--jquery-->
$('#myModal').on('show.bs.modal', function (e) {
    window.history.pushState('forward', null, '#modal');
});

$('#myModal').on('hide.bs.modal', function (e) {
    //pop the forward state to go back to original state before pushing the "Modal!" button
});

$(window).on('popstate', function () {
    $('#myModal').modal('hide');
});

jsfiddle source

5 个答案:

答案 0 :(得分:6)

我知道这个问题是在2016年问到的,现在是2020年,但我仍在回答这个问题,以便将来可能正在搜索它的人们(我相信人们会)。

这是此问题的一站式解决方案。只需将以下代码复制并粘贴到您网站的.js文件(如custom.js)中,或粘贴到$(document).ready(function(){})中的页脚中即可(如

$(document).ready(function(){
  $('div.modal').on('show.bs.modal', function() {
    var modal = this;
    var hash = modal.id;
    window.location.hash = hash;
    window.onhashchange = function() {
      if (!location.hash){
        $(modal).modal('hide');
      }
    }
  });
  $('div.modal').on('hidden.bs.modal', function() {
    var hash = this.id;
    history.replaceState('', document.title, window.location.pathname);
  });
  // when close button clicked simulate back
  $('div.modal button.close').on('click', function(){
    window.history.back();
  })
  // when esc pressed when modal open simulate back
  $('div.modal').keyup(function(e) {
    if (e.keyCode == 27){
      window.history.back();          
    }
  });
});

我看到很多人都在寻找解决方案,现在我正在对搜索进行句号。这应该是我们所有人都在等待的确切工作,“在PC和Mobile上单击后退按钮并在移动设备上向后轻扫手势时关闭引导程序模式(已测试)” 。可以根据您的需要随意定制它。开心的一天:)

答案 1 :(得分:1)

您可以使用以下代码来摆脱打开的模态窗口,而不是意外移动到浏览器的上一页。

//When ever the modal is shown the below code will execute.
$(".modal").on("shown.bs.modal", function()  {
    var urlReplace = "#" + $(this).attr('id'); 
    history.pushState(null, null, urlReplace); 
  });

  // This code gets executed when the back button is clicked, hide any/open modals.
  $(window).on('popstate', function() { 
    $(".modal").modal('hide');
  });

答案 2 :(得分:0)

我找到了解决方案。随意发布任何其他优雅的解决方案。

$('#myModal').on('hide.bs.modal', function (e) {
    if(location.hash=='#modal')window.history.back();
});

$(window).on('popstate', function (event) {  //pressed back button
    if(event.state!==null)$('.modal').modal('hide');
});

答案 3 :(得分:0)

按钮单击弹出窗口将出现。

$(document).ready(function(){
      $(".popup-btn").click(function () {
          location.hash = "popup";
          $(".popup-panel").show();
      });
});

在位置更改时,它会被隐藏:

$(window).bind('hashchange', function () {
      if (location.hash == null || location.hash == "") {
          $(".popup-panel").hide();
      }
});

答案 4 :(得分:0)

我将此代码用于自己的网站

window.onload=function(){

    State=popset=0;
    setpops=function(){
        if(popset) return;popset=1;// dont set event multiple times
        window.onpopstate=function(e){
            State=e.state;
            if(e.state=="hide"){
                $(".modal").modal("hide").removeClass("in show");
                $(".modal-backdrop").remove();// force hide bg
                /* in some old devices .modal("hide") is not enough */
            }
        };
    };
    $(".modal").on("show.bs.modal",function(){// while modal show
        path=window.location.pathname+window.location.search;
        history.pushState("hide",null,path);
        history.pushState("show",null,path);
        State="show";
    })
    .on("hidden.bs.modal",function(){// while modal hide
        if(!!State)
            history.go(State=="hide"?-1:-2);// remove extra forward states
    });
    window.onpopstate=function(){setpops();};
    setTimeout(function(){setpops();},2000);// fix old webkit bug

};
  • 不要使用$(document).ready而不是window.onload

Chrome 67,FireFox 65,Chromium 71/78,Android 4.1 / 4.2 / 7.1 / 9.0 上进行了测试

(我是user5490177的已删除帐户,回答了same question,这是新的改进版本)