2012-01-10 45 views
0

考慮這個jsfiddle:http://fiddle.jshell.net/maple/JbEJN/show/(這是結果窗口,爲了使replaceState工作,請參閱actual fiddle with code here: http://jsfiddle.net/maple/JbEJN/)。Opera 11.50+執行history.replaceState()

這是一個簡單的JavaScript標籤控制。我點擊「選項卡1」並查看一個div的內容。我點擊'Tab 2'來隱藏顯示的div,並顯示另一個不同的內容。您將獲得演練,標準選項卡控件。

現在,我想要使用#標籤能夠書籤或鏈接頁面與選定的某個選項卡。我想要的是創建一個瀏覽器歷史記錄條目中的每個這樣當我壓回我有10個標籤圈通過我標籤之間切換的時間之前,我其實可以回到我所來自的頁面。

我打算實現這一點的方法是使用replaceState()當我切換標籤插入一個主題標籤到頁面的URL,就像這樣:

window.history.replaceState(null, '', '#tabname'); 

我希望這裏是發生什麼事在切換標籤頁時不會創建任何歷史記錄,所以當我在標籤頁之間切換幾次後,我會看到哈希標記的變化,但是當我點擊後退按鈕時,我只是回到前一頁(或者如果打開測試,沒有任何反應頁面在新窗口中)。

這正常在Chrome,Firefox和Safari,但不是Opera 11.50和11.60。據我所知,Opera聲稱完全支持Opera中的歷史API,但在Opera中會發生什麼情況是replaceState()的工作方式與pushState()類似,將條目放入歷史記錄中。

這是在Opera中的錯誤,或者我應該使用API​​在歌劇一些不同的方式?

回答

0

我想這裏發生了什麼是點擊事件的默認操作爲激活鏈接 - 所以你打電話replaceState後()的默認操作將更新URL,新增#tabname,創造了歷史記錄條目。嘗試使用event.preventDefault()http://jsfiddle.net/JbEJN/8/show/

我不確定爲什麼您的原始代碼在Chrome和Firefox中按照預期工作。據推測,如果replaceState()已經更新了URL並且鏈接的激活不會改變它,他們不會創建一個歷史記錄條目?如果是這樣,Opera可能應該改變以匹配它們。你能否在https://bugs.opera.com/wizard/上報告這個問題?如果你給我的錯誤參考ID,我會跟進。

+0

你是正確的,加入event.preventDefault()修復Opera中的問題(和葉的事情在其他瀏覽器不變)。我提交了一個bug,它的ID是DSK-355229。 – Maple 2012-01-13 20:32:05