8

我正在使用后端的 CodeIgniter 和前端的 Backbone.js 开发一个 Web 应用程序。我还使用 HTML5 Boilerplate 作为我的开始模板。

我使用 Backbone 的 Controller 和 History 作为应用程序的主要导航。我过去做过一次,一切正常。问题是,当我使用 Backbone.History.start() 开始 hashchange 事件捕获并单击链接 example.com/#home 时,url 中的哈希更改,事件被触发但 2 秒后,哈希被清除从 url 和 javascript 错误仅在 ie7 中引发。

我查看了源代码,并且在 IE7 中实现了 hashchange 事件,方法是创建一个 IFRAME,运行一个间隔来检查哈希值的变化。

以前有人遇到过这个奇怪的错误并知道如何解决吗?

4

4 回答 4

4

使用 Backbone 处理#hash 基础应用程序的正确方法似乎是 Backbone.history.saveLocation(hash) 和 Backbone.history.loadUrl() 之后以启用控制器的路由。

虽然我以前知道这一点......玩得开心这个很棒的 MVC 库:)

于 2011-02-15T15:38:56.347 回答
3

我发现可行的解决方案是使用 Ben Alman 的hashchange plugin。转到 Backbone.History 中的 start 函数,并将 start 函数的代码替换为 this。

开始:函数(){
    $(window).hashchange(this.checkUrl);
    返回 this.loadUrl();
}

并确保在您的代码中包含 hashchange 插件文件。

于 2011-05-31T21:21:54.747 回答
2

单击哈希 URL 实际上并不会在 IE 中保存历史记录条目——使用 Backbone 的saveLocation功能删除您希望能够返回的位置的标记。有关完整的独家新闻,请参阅:

http://documentcloud.github.com/backbone/#Controller-saveLocation

于 2011-02-14T14:14:56.583 回答
1

我在官方问题列表中找到了 Jon Leighton 的解决方案:https ://github.com/documentcloud/backbone/issues/228

直到官方补丁将其添加到主干.js(主干 0.3.3 中的第 689 行)

this.iframe.document.open().close();
this.iframe.location.hash = window.location.hash;

在以下行之后:

this.iframe = $('iframe src="javascript:0" tabindex="-1" ').hide().appendTo('body')[0].contentWindow;

(我无法编写完整的 i-frame 标签 < & /> - 这里不允许 :))

于 2011-04-28T09:14:36.843 回答