我在后端开发了一个带有CodeIgniter的Web应用程序,在前端开发了Backbone.js。 我也使用HTML5 Boilerplate作为我的开始模板。
我使用Backbone的控制器和历史记录作为我的应用程序的主要导航。我过去曾经做过一次,一切都很好。问题是,当我使用Backbone.History.start()启动hashchange事件捕获并单击链接example.com/#home,url中的哈希更改时,事件被触发但是在2秒之后,哈希被清除来自url,javascript错误仅在ie7中抛出。
通过创建运行间隔的IFRAME来检查哈希值的变化,我在IE7中查看了源代码和hashchange事件。
之前有人有这个奇怪的错误,知道如何解决这个问题吗?
答案 0 :(得分:4)
使用Backbone处理#hash基础应用程序的正确方法似乎是Backbone.history.saveLocation(哈希),并在Backbone.history.loadUrl()之后启用Controller的路由。
Whish我之前知道这个...... 享受这个令人敬畏的MVC库:)
答案 1 :(得分:3)
我发现工作的解决方案是使用Ben Alman的hashchange plugin。转到Backbone.History中的start函数,并用此替换start函数的代码。
start : function() { $(window).hashchange(this.checkUrl); return this.loadUrl(); }
请务必在代码中包含hashchange插件文件。
答案 2 :(得分:2)
单击哈希URL实际上并不在IE中保存历史记录条目 - 使用Backbone的saveLocation
功能删除您希望能够返回的位置的标记。有关完整的独家新闻,请参阅:
http://documentcloud.github.com/backbone/#Controller-saveLocation
答案 3 :(得分:1)
我在Jon Leighton的官方问题列表中找到了解决此问题的解决方案:https://github.com/documentcloud/backbone/issues/228
直到一个官方补丁添加到backbone.js(Backbone 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标签<& /> - 这里不允许这样做:))