【问题标题】:Why do I have to press back twice to go back in Backbone?为什么我必须按两次才能返回 Backbone?
【发布时间】:2013-12-02 16:05:33
【问题描述】:

Live Demo of the problem

我有这个小示例应用程序,我尝试在其中实现具有历史记录的路由系统。它可以正常工作,但由于某种原因,我必须按两次后退按钮。如果你打开控制台,你可以看到日志。当我按下例如 page1 和 page2 以及返回链接时,它会记录 page2 两次。为什么?如果我再次按下它,它会记录page1 两次。什么?然后它终于回去了。为什么我要按两次?为什么日志如此疯狂?我怎样才能让它发挥作用?

HTML

<div id="home">Home</div>
<div id="page1">Page1</div>
<div id="page2">Page2</div>
<div id="back">Back</div>

JavaScript

var app = {};
app.router = Backbone.Router.extend({

    routes: {
        '': 'home',
        'page1': 'page1',
        'page2': 'page2',
    },

    home: function () {
        console.log('home');
        Backbone.history.history.pushState('search');
        console.log(Backbone.history.history);
    },

    page1: function () {
        console.log('page1');
        Backbone.history.history.pushState('page1');
        console.log(Backbone.history.history);
    },

    page2: function () {
        console.log('page2');
        Backbone.history.history.pushState('page2');
        console.log(Backbone.history.history);
    },

});

var router = new app.router();
Backbone.history.start();

$(document).on('click', '#back', function () {
    console.log('back');
    console.log(Backbone.history.history);
    Backbone.history.history.back();
    console.log(Backbone.history.history);
    router.navigate(Backbone.history.history.state, {trigger: true, replace: true});
});

$(document).on('click', '#home', function () {
    router.navigate('home', {trigger: true, replace: true});
});

$(document).on('click', '#page1', function () {
    router.navigate('page1', {trigger: true, replace: true});
});

$(document).on('click', '#page2', function () {
    router.navigate('page2', {trigger: true, replace: true});
});

【问题讨论】:

  • 我不知道 Backbone,但我猜它会为你调用 pushState,所以你不应该自己调用它。
  • @SLaks 如果我删除该行,那么它将带我回到主页。如果不调用pushState() Backbone.history.history.state 将是undefined
  • 不确定为什么要将 pushState 调用自己添加到应用程序中。为什么不让导航为你做这件事?
  • @kinakuta 因为没有pushState() 它让我回到首页或上一个网站。
  • 再说一次,为什么不直接使用导航来创建您的历史条目呢?一般来说,我会避免使用导航来触发导航,而是使用它来简单地管理您的浏览器历史记录。

标签: javascript backbone.js url-routing backbone-routing html5-history


【解决方案1】:

这是否符合您的目的:

$(document).on('click', '#back', function () {
    window.history.back();
});

MDNwindow.history

【讨论】:

  • 您是否尝试过您的解决方案? Example 1:如果我复制这个函数,并删除pushState(),它会让我回到最后一页。 Example 2:如果我复制这个函数并保留pushState(),那么我必须再按两次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
相关资源
最近更新 更多