2011-02-11 44 views
8

我正在開發一個在後端使用CodeIgniter並在前端使用Backbone.js的Web應用程序。 我也使用HTML5 Boilerplate作爲我的開始模板。Backbone.js只在IE7中導致錯誤

我使用Backbone的控制器和歷史記錄作爲通過我的應用程序的主導航。我過去曾經做過一次,一切都很好。問題是,當我開始使用Backbone.History.start()開始hashchange事件捕獲並單擊鏈接example.com/#home時,URL中的哈希更改,事件被觸發,但在2秒後,哈希被清除從URL和JavaScript錯誤只在ie7中拋出。

我已經看到了源代碼,並通過創建一個運行間隔檢查哈希值更改的IFRAME在IE7中實現了hashchange事件。

之前有人有這個奇怪的錯誤,並知道如何解決這個問題?

回答

4

與骨幹似乎Backbone.history.saveLocation(散)來處理#hash基本應用程序的正確方法和後Backbone.history.loadUrl(),使控制器的路由。

韋思我知道在這之前... 獲得樂趣真棒MVC庫:)

2

點擊散列URL實際上並不在IE中保存歷史記錄 - 使用Backbone的saveLocation功能可以刪除您想要返回的位置的標記。對於全瓢,請參閱:

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

+1

不幸的是,Backbone的saveLocation不會觸發hashchange事件,我的整個應用程序都需要這個功能。我在IE調試控制檯`SCRIPT1014:無效字符javascript:0,第1行字符2;`這似乎與IE隱形IFRAME有關。任何想法如何解決它? – 2011-02-14 15:27:37

+0

我測試了另一個Backbone.js教程,它利用Backbone的歷史記錄和IE7中出現的相同問題。以下是由Elf Sternberg [link](http://clients.dominic-mercier.com/backbone/)製作的演示的網址。正如你所看到的,當你點擊一個項目時,哈希將變爲#item/c1,並在50 ms(這是檢查哈希變化的間隔幀)後變回#。也許我們都使用錯誤的Backbone的歷史?你能提供一些真實的使用情況嗎? – 2011-02-14 17:20:39

+0

問題是ie7中的行爲與其他瀏覽器完全不同。哈希標記不會在加載頁面時加載,哈希標記不會像其他瀏覽器那樣在更改後自動保存在歷史記錄中。我想這個需要在將來得到解決,以便所有瀏覽器的行爲都一樣。 – Julien 2011-03-18 16:49:23

1

我發現喬恩頓在官方名單的問題這個問題的解決方案:https://github.com/documentcloud/backbone/issues/228

直到一個官方補丁(在骨幹0.3.3線689)

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

以下行之後將其添加到Backbone.js的:

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

(我couldn't寫出完整的I幀標籤< & /> - 它isn't這裏不允許:))

3

,我發現工作是使用本Alman的hashchange plugin的解決方案。轉到Backbone.History中的啓動函數,並用此代替啓動函數的代碼。

 
start : function() { 
    $(window).hashchange(this.checkUrl); 
    return this.loadUrl(); 
} 

並確保在代碼中包含hashchange插件文件。