History.pushState 浏览器后退和前进按钮失败

history.pushstate fails browser back and forward button

本文关键字:按钮 失败 pushState 浏览器 History      更新时间:2023-09-26

我正在使用jQuery在div容器中动态加载内容。

服务器端代码检测请求是 AJAX 还是 GET。

我希望浏览器的后退/前进按钮能够处理代码,所以我尝试使用 history.pushState。我必须遵循以下代码段:

$('.ajax').on('click', function(e) {
    e.preventDefault();
    $this = $(this);
    $('#ajaxContent').fadeOut(function() {
        $('.pageLoad').show();
        $('#ajaxContent').html('');
        $('#ajaxContent').load($this.attr('href'), function() {
            window.history.pushState(null,"", $this.attr('href'));
            $('.pageLoad').hide();
            $('#ajaxContent').fadeIn();
        });
    });
});

一切正常,除了使用浏览器后退/前进按钮浏览时,栏中的地址会根据计划更改,但页面不会更改。我做错了什么?

在克莱顿的回答的帮助下更新了脚本

var fnLoadPage = function(url) {
    $('#ajaxContent').fadeOut(function() {
        $('.pageLoad').show();
        $('#ajaxContent').html('').load(url, function() {
            $('.pageLoad').hide();
            $('#ajaxContent').fadeIn();
        });
     });
};
window.onpopstate = function(e) {
     fnLoadPage.call(undefined, document.location.href);
};
$(document).on('click', '.ajax', function(e) {
    $this = $(this);
    e.preventDefault();
    window.history.pushState({state: new Date().getTime()}, '', $this.attr('href'));
    fnLoadPage.call(undefined, $this.attr('href'));
});

@Barry_127,看看这是否适合你:http://jsfiddle.net/SX4Qh/

$(document).ready(function(){
    window.onpopstate =  function(event) {
        alert('popstate fired');
        $('#ajaxContent').fadeOut(function() {
            $('.pageLoad').show();
            $('#ajaxContent').html('')
                             .load($(this).attr('href'), function() {
                                $('.pageLoad').hide();
                                $('#ajaxContent').fadeIn();
                             });
        });
    };
    $('.ajax').on('click', function(event) {
        event.preventDefault();
        alert('pushstate fired');
        window.history.pushState({state:'new'},'', $(this).attr('href'));
    });
 });

如果您查看我提供的小提琴并单击按钮,则会触发警报,表明您正在推动一个新状态。如果在 pushstate 触发后继续单击后退按钮,您将看到上一页(或 popstate)将触发。