9

我有一個單頁應用程序,它使用Knockout.js進行數據綁定,Sammy.js用於路由客戶端(基於哈希)的URL。Sammy.js路由沒有從IE10中的敲除鏈接鏈接發射

但是,我在Internet Explorer中看到一個奇怪的問題:有時,點擊鏈接時,會改變瀏覽器地址欄中的URL,但相應的Sammy路徑不會執行。它不會發生每一次(但我可以一貫重現錯誤),並且它只發生在IE10(Chrome每次都能正常工作)。它似乎也與Knockout有關,因爲一組硬編碼的鏈接不會出現相同的問題。

爲了說明,我已經剝離的一切,但最低限度重現問題和創建了兩個jsbin例子:

實施例1(與敲除):http://jsbin.com/aretis/2/

要查看問題,打開上面的鏈接並點擊「記錄#1」,然後點擊「Baz」,然後再次點擊「記錄#1」。記錄1的URL將出現在地址欄中,但該記錄的路由不會附加到列表中。

實施例2(不敲除):http://jsbin.com/amivoq/1/

在本例中,我的記錄鏈接,而不是一個數據綁定列表的靜態列表。點擊任何鏈接(以任何順序)將導致該路由被添加到列表中(因爲它應該)。

提醒一下,這些必須在IE中運行才能重現問題。

任何想法?

+0

我現在在使用IE 10的應用程序中遇到同樣的問題。您是否暴露了激活方法?當來回切換時會被調用嗎? – Boone

+1

我通過綁定到$(window).on(「hashchange」)並編寫我自己的URL路由器來解決問題(也許「解決」是更好的詞組)。我的需求非常簡單,我懷疑我只用了大約10%的Sammy.js的能力。我仍然對我的問題的來源感到好奇,所以我將這個問題留下了。 –

+0

你可以用sammy JS重新創建示例1嗎? 我還基於SammyJS創建了自己的路由器。 @Matt Peterson,謝謝你的提示。我不知道'hashchange'事件。我正在檢查窗戶。帶定時器的位置:)。 – Damien

回答

2

根據我上面的評論,我通過捕獲window.hashchange事件並自己解析URL來解決此問題。這是我真正使用的Sammy.js的唯一部分,我沒有任何運氣追蹤實際問題。希望這會幫助別人。

我做的第一件事是hashchange綁定事件:

$(function() { 
    $(window).on("hashchange", HandleUrl); 

    // Call our URL handler to deal with any initial URL given to us. 
    HandleUrl(); 
} 

這需要以下URL解析器:

function HandleUrl() { 
    var hash = location.hash; 

    if (hash.indexOf("#Account") >= 0) { 
     var splitParts = hash.split("/"); 

     if (splitParts.length >= 2) { 
      ShowLoadingBox(); 
      ShowAccountDetailFromId(splitParts[1]); 
     } 
    } else if (hash.indexOf("#Contact") >= 0) { 
     var splitParts = hash.split("/"); 

     if (splitParts.length >= 2) { 
      ShowLoadingBox(); 
      ShowContactDetailFromId(splitParts[1]); 
     } 
    } else if (hash.indexOf("#ThingsToDo") >= 0) { 
     SwitchToPanel("navPanelThingsToDo"); 
    } else if (hash.indexOf("#ThingsIveDone") >= 0) { 
     SwitchToPanel("navPanelThingsIveDone"); 
    } else if (hash.indexOf("#Reports") >= 0) { 
     SwitchToPanel("navPanelReports"); 
    } else { 
     SwitchToPanel("navPanelMyAccounts"); 
    } 
} 

ShowAccountDetailFromId()SwitchToPanel()的功能只是顯示並填充(使用Ajax調用到網絡服務)適當的<div>。這可能是一種完全天真的方法,但它可以工作(即,您可以爲網址添加書籤,後退按鈕和瀏覽器歷史記錄等)。我對無答案的「答案」表示歉意。