HTML5历史记录API:不能多次向后退

用户4935010

我一直在尝试使脚本正常工作,但显然有问题:当我尝试使用浏览器后退按钮向后移动时,它在第一页后退时停止,即第二次单击后退按钮时不起作用正确地更新自己的当前页面。

示例:主页->第二页->第三页->第二页->第二页->第二页(依此类推)

主页->第二页->第三页->第四页->第三页->第三页(依此类推)

相反,它可以工作:主页->第二页->主页

有人知道我失踪了吗?

var domain = 'http://example.com/';

function updatePage(json){
    var postData = JSON.parse(json);

    // pushState 
    var url = domain + postData.url;
    var title = postData.title;
    document.title = title;
    history.pushState({"page": url}, title, url);

    // Clears some elements and fills them with the new content
    // ...

    // Creates an 'a' element that triggers AJAX for the next post
    var a = document.createElement('a');
    a.innerHTML = postData.next;
    a.href = domain + postData.next;
    document.getElementById('container').appendChild( a );
    listenerAttacher( a );

    // Creates another 'a' element that triggers AJAX for the previous post
    a = document.createElement('a');
    a.innerHTML = postData.previous;
    a.href = domain + postData.previous;
    document.getElementById('container').appendChild( a );
    listenerAttacher( a );
}


function loadPost( resource ){
    // Loads post data through AJAX using a custom function
    loadHTML( resource, function(){
        updatePage( this.responseText );
    });
}

function listenerAttacher( element ){
    // Adds a click listener to an element. 
    element.addEventListener('click', function(e){
        e.preventDefault();
        e.stopPropagation();
        loadPost( this.href +'.json' );
        return false;
    }, 
    false);
}


(function(){
    history.replaceState({'page': window.location.href}, null, window.location.href);

    // Adds the event listener to all elements that require it.
    var titles = document.querySelectorAll('.post-title');
    for (var i = 0; i < titles.length; i++){
        listenerAttacher( titles[i] );
    }

    // Adds a popstate listener
    window.addEventListener('popstate', function(e){
        if ( e.state == null || e.state.page == domain ){
            window.location = domain;

        }
        else {
            loadPost( e.state.page + '.json' );
        }
    }, false);
})();
尔辛·巴萨兰(Ersin Basaran)

当您按下返回按钮时,popstate将触发事件并loadPost调用函数。但是,在中loadPosthistory.pushState方法会再次被调用,这会将当前页面再次推送到历史记录堆栈中。这就解释了为什么第一个后退按钮起作用,然后却不起作用。

1)一个快速解决方案是检查当前状态是否与您要推送的状态匹配:

if (!history.state || history.state.page!=url)
    history.pushState({ "page": url }, title, url);

2)事件更好,您可以向loadPost添加参数updatePage以防止不必要的pushState调用:

function updatePage(json, disablePushState) {
    ...
    // disablePushState is true when back button is pressed
    // undefined otherwise
    if (!disablePushState)  
        history.pushState({ "page": url }, title, url);
    ...
}


function loadPost(resource, disablePushState) {
    // Loads post data through AJAX using a custom function
    loadHTML(resource, function (responseText) {
        updatePage(responseText, disablePushState);
    });
}

    ...
    window.addEventListener('popstate', function (e) {
        if (e.state == null || e.state.page == domain) {
            window.location = domain;
        }
        else {
            loadPost(e.state.page + '.json', true);
        }
        return true;
    });

希望能有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

HTML5历史记录API初始加载问题

来自分类Dev

样式历史记录后退按钮

来自分类Dev

HTML5历史记录服务器端支持的URL重写

来自分类Dev

如何使用哈希导航和html5历史记录停止jQuery Mobile?

来自分类Dev

HTML5历史记录-返回上一页的完整按钮?

来自分类Dev

如何使用HTML5历史记录在此示例上使用前进按钮?

来自分类Dev

HTML5历史记录pushState无法正常工作

来自分类Dev

如何使用哈希导航和html5历史记录停止jQuery Mobile?

来自分类Dev

检测使用历史记录API的导航是向后还是向前

来自分类Dev

如何使用Java清除后退按钮历史记录?

来自分类Dev

如何实现“历史记录”后退按钮

来自分类Dev

使用历史记录后退按钮检测

来自分类Dev

AngularJS添加到浏览器历史记录中,而无需重新加载页面和HTML5 pushstate

来自分类Dev

XCode 5不显示完整的SVN历史记录

来自分类Dev

从TeamCity API获取统计历史记录

来自分类Dev

TFS API:如何获取文件的历史记录?

来自分类Dev

获取Paypal API上的付款历史记录

来自分类Dev

从特定号码从Twilio API检索SMS历史记录

来自分类Dev

命令行中的MySQL向后和向前搜索历史记录

来自分类Dev

在ZSH历史记录增量搜索中向后循环搜索

来自分类Dev

使用iframe进行联合会话历史记录向后导航

来自分类Dev

如何在Firefox中禁用Option +滑动浏览历史记录(向前和向后)?

来自分类Dev

如何在Chrome扩展程序中使用历史记录API获取浏览历史记录

来自分类Dev

单击浏览器的后退按钮清除历史记录

来自分类Dev

更新iframe,历史记录和URL。然后使其与后退按钮一起使用

来自分类Dev

jQuery ajax发布调用,ajaxify历史记录和后退按钮

来自分类Dev

如何使用Phonegap 3.5.0中的Android设备后退按钮返回历史记录?

来自分类Dev

React Navigation-浏览并设置后退按钮的历史记录

来自分类Dev

如何使用Phonegap 3.5.0中的Android设备后退按钮返回历史记录?

Related 相关文章

  1. 1

    HTML5历史记录API初始加载问题

  2. 2

    样式历史记录后退按钮

  3. 3

    HTML5历史记录服务器端支持的URL重写

  4. 4

    如何使用哈希导航和html5历史记录停止jQuery Mobile?

  5. 5

    HTML5历史记录-返回上一页的完整按钮?

  6. 6

    如何使用HTML5历史记录在此示例上使用前进按钮?

  7. 7

    HTML5历史记录pushState无法正常工作

  8. 8

    如何使用哈希导航和html5历史记录停止jQuery Mobile?

  9. 9

    检测使用历史记录API的导航是向后还是向前

  10. 10

    如何使用Java清除后退按钮历史记录?

  11. 11

    如何实现“历史记录”后退按钮

  12. 12

    使用历史记录后退按钮检测

  13. 13

    AngularJS添加到浏览器历史记录中,而无需重新加载页面和HTML5 pushstate

  14. 14

    XCode 5不显示完整的SVN历史记录

  15. 15

    从TeamCity API获取统计历史记录

  16. 16

    TFS API:如何获取文件的历史记录?

  17. 17

    获取Paypal API上的付款历史记录

  18. 18

    从特定号码从Twilio API检索SMS历史记录

  19. 19

    命令行中的MySQL向后和向前搜索历史记录

  20. 20

    在ZSH历史记录增量搜索中向后循环搜索

  21. 21

    使用iframe进行联合会话历史记录向后导航

  22. 22

    如何在Firefox中禁用Option +滑动浏览历史记录(向前和向后)?

  23. 23

    如何在Chrome扩展程序中使用历史记录API获取浏览历史记录

  24. 24

    单击浏览器的后退按钮清除历史记录

  25. 25

    更新iframe,历史记录和URL。然后使其与后退按钮一起使用

  26. 26

    jQuery ajax发布调用,ajaxify历史记录和后退按钮

  27. 27

    如何使用Phonegap 3.5.0中的Android设备后退按钮返回历史记录?

  28. 28

    React Navigation-浏览并设置后退按钮的历史记录

  29. 29

    如何使用Phonegap 3.5.0中的Android设备后退按钮返回历史记录?

热门标签

归档