2013-04-27 59 views
9

我想用location.hash對我的客戶端應用程序的狀態進行編碼,以便用戶可以使用URL輕鬆地在其完整狀態下書籤和/或共享應用程序。瀏覽器中location.hash的最大尺寸

關於URL的最大長度有一些(過時的)主題,特別是Internet Explorer中的限制。但是不清楚location.hash的最大尺寸是多少。由於散列只存在於客戶端中,因此http或服務器的限制不相關。

我做了一個簡單的jsfiddle來測試這個:http://jsfiddle.net/Jz3ZA/。在Chrome和Firefox(Ubuntu 12.04)中,高達50K的哈希似乎都可以工作。這是否意味着我可以使用它們來存儲狀態,還是我忽略了其他限制?

+2

有有關URL在所有尺寸的限制沒有標準,所以散列理論上可以是任何長度,但你不能相信什麼特定瀏覽器會做(尤其是IE)。 – 2013-04-27 00:54:41

+0

你爲什麼不把狀態存儲在服務器中? – Blender 2013-04-27 01:11:30

+0

我已經在Internet Explorer 11上運行了你的小提琴,並且它在散列長度爲3000的時候失敗了 – 2016-11-26 08:54:45

回答

-2

What is the maximum length of a URL in different browsers?

這通常不包括散列部了,所以我不認爲有一個標準。

我想指出片段標識符通常用於標識文檔的片段,不應該用於存儲應用程序的整個狀態。 您應該使用localstorage代替。

如果您希望共享或書籤功能,請考慮將應用程序的狀態存儲在服務器端,並使用片段標識符來存儲存儲狀態的標識。

+3

這個問題是關於哈希部分的,所以這個問題沒有回答。 – Jeroen 2013-05-06 03:05:14

-1

這樣一個誤導性的解釋。哈希的大小沒有限制,可隨意使用它,只要你喜歡。只要記住它不是url部分。

+1

我不認爲這是真的。維基百科說:*哈希標記#引入的片段標識符是文檔URL的可選最後部分。* – Jeroen 2014-09-27 08:57:34

4

根據您的JS Fiddle(及其修改後的版本http://jsfiddle.net/Jz3ZA/18/(請參閱下面的代碼示例)),您可以測試大量瀏覽器以獲得有效的基準。

  • 鉻:50K +
  • 火狐:50K +
  • Safari瀏覽器(iOS版):50K +
  • 的Internet Explorer 11:失敗 2025和
  • 微軟邊緣之間2,050:失敗 2,025和2,050之間

因此無論其他瀏覽器支持什麼,如果您需要支持Microsoft Edge或IE11,那麼您需要保留2,025個字符散列。 由於IE瀏覽器(因此我猜測邊緣)歷史上有URL長度限制...這也可能取決於您的基本URL的長度。

function testall(){ 
 
    var sizes = [10,100,1000,2000,2025,2050,2100,2250,2500,2750,3000,4000,5000,10000, 50000]; 
 
    for(var i=0;i<sizes.length;i++){ 
 
    var n = sizes[i]; 
 
    if(!testhash(n)){ 
 
     alert("test failed at hash of length: " + n); 
 
     return; 
 
    } 
 
    } 
 
    alert("all tests passed"); 
 
} 
 

 
function testhash(n){ 
 
    var somestring = "#" + makestring(n); 
 
    window.location.hash = somestring; 
 
    var success = (window.location.hash == somestring); 
 
    return success 
 
}  
 

 
function makestring(n){ 
 
    var text = ""; 
 
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 
 

 
    for(var i=0;i<n;i++){ 
 
     text += possible.charAt(Math.floor(Math.random() * possible.length)); 
 
    } 
 
    return text; 
 
} 
 
$("button").on("click", testall);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 
 
<button>Test!</button>