使用 onpopstate 和 Balupton 的 History.js 来返回

发布于 2024-12-25 12:33:44 字数 1419 浏览 0 评论 0原文

我的目标是存储网站的当前状态,以便我可以通过按浏览器后退按钮返回到该状态。目前,我已经使用 HTML5 本机函数使用 pushState 和 popState 实现了此目的,如下所示:

<script type="text/javascript">
  $("a").click(function(e) {
    $("#element").load($(this).attr('href') + ' #otherElement');
    $("html, body").animate({ scrollTop: 0 }, 0);
    previous_page = location.href;
    window.history.pushState({page: $(this).index()}, $(this).html(), $(this).attr('href'));
    e.preventDefault();
    return false;
  });

  window.popupstate = function(e) {
    location.reload();
  }
</script>

这段代码在 Firefox 4 中按预期工作。但是,在 Chrome 中,页面会永久重新加载。因此,我想使用 Balupton 的 History.js 库在所有浏览器中运行代码片段,但我发现 Balupton 页面上的示例不是很有帮助。

我已经尝试了以下方法(不起作用):

var History = window.History;
History.pushState({state:'root'},'root',$(this).attr('href'));

$("a").click(function(e) {
  $("#element").load($(this).attr('href') + ' #otherElement');
  $("html, body").animate({ scrollTop: 0 }, 0);
  History.pushState({state:$(this).attr('href')},$(this).attr('href'),$(this).attr('href'));
  return false;
});

History.Adapter.bind(window,'statechange',function(){ 
    var State = History.getState(); // Note: We are using History.getState() instead of event.state
    History.log('statechange:', State.data, State.title, State.url);
    if (State.title == 'root') {
        History.back();
        location.reload();
    }
});

谢谢。

my objective is to store the current state of a web site, such that I can return to that state via pressing the browsers back button. Currently, I've achieved this using pushState and popState using the HTML5 native functions as follows:

<script type="text/javascript">
  $("a").click(function(e) {
    $("#element").load($(this).attr('href') + ' #otherElement');
    $("html, body").animate({ scrollTop: 0 }, 0);
    previous_page = location.href;
    window.history.pushState({page: $(this).index()}, $(this).html(), $(this).attr('href'));
    e.preventDefault();
    return false;
  });

  window.popupstate = function(e) {
    location.reload();
  }
</script>

That piece of code works as expected in Firefox 4. However, in Chrome, the page reloads permanently. Thus, I would like to use Balupton's History.js library to run the code snippet in all browser, but I found the example on Balupton's page not very helpful.

I've tried the following (which does not work):

var History = window.History;
History.pushState({state:'root'},'root',$(this).attr('href'));

$("a").click(function(e) {
  $("#element").load($(this).attr('href') + ' #otherElement');
  $("html, body").animate({ scrollTop: 0 }, 0);
  History.pushState({state:$(this).attr('href')},$(this).attr('href'),$(this).attr('href'));
  return false;
});

History.Adapter.bind(window,'statechange',function(){ 
    var State = History.getState(); // Note: We are using History.getState() instead of event.state
    History.log('statechange:', State.data, State.title, State.url);
    if (State.title == 'root') {
        History.back();
        location.reload();
    }
});

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

三生池水覆流年 2025-01-01 12:33:44

我已经为我的问题找到了有效的解决方案。由于我在替换整个 DOM 路径时丢失了绑定,因此我只需要隐藏/显示元素,如下所示:

var History = window.History;

$("a").live('click', function(e) {
    if ($(this).attr('href').startsWith('corpus-')) {
        $("#element").hide();
        $("#newElement").load($(this).attr('href') + ' #otherElement');
        $("html, body").animate({ scrollTop: 0 }, 0);
        History.pushState({state:$(this).attr('href')},$(this).attr('href'),$(this).attr('href'));
        return false;
    }
});

History.Adapter.bind(window,'statechange',function(){ 
    var State = History.getState();
    History.log('statechange:', State.data, State.title, State.url);
    $("#element").toggle();
    $("#newElement").toggle();
});

该解决方案还不太理想。

I've found a working solution for my problem. Since I am loosing the bindings while replacing an entire DOM path, I need just to hide/show the elements as follows:

var History = window.History;

$("a").live('click', function(e) {
    if ($(this).attr('href').startsWith('corpus-')) {
        $("#element").hide();
        $("#newElement").load($(this).attr('href') + ' #otherElement');
        $("html, body").animate({ scrollTop: 0 }, 0);
        History.pushState({state:$(this).attr('href')},$(this).attr('href'),$(this).attr('href'));
        return false;
    }
});

History.Adapter.bind(window,'statechange',function(){ 
    var State = History.getState();
    History.log('statechange:', State.data, State.title, State.url);
    $("#element").toggle();
    $("#newElement").toggle();
});

The solution is not quite ideal, yet.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文