浏览器中location.hash的最大大小

时间:2013-04-27 00:47:30

标签: javascript internet-explorer google-chrome firefox browser

我想使用location.hash对我的客户端应用的状态进行编码,以便用户可以使用网址轻松地将应用标记和/或共享到完整状态。

网址的最大长度上有许多(过时的)主题,尤其是Internet Explorer中的限制。但是,不清楚location.hash的最大大小是多少。由于哈希仅存在于客户端中,因此http或服务器的限制无关紧要。

我做了一个简单的jsfiddle来测试它:http://jsfiddle.net/Jz3ZA/。在Chrome和Firefox(Ubuntu 12.04)中,最多可以使用高达50K的哈希值。这是否意味着我可以使用它们来存储状态,还是我忽略了其他限制?

3 个答案:

答案 0 :(得分:5)

基于你的JS Fiddle(以及它的修改版http://jsfiddle.net/Jz3ZA/18/(参见下面的代码示例)),你可以测试很多浏览器以获得有效的基线。

  • Chrome:50K +
  • Firefox:50K +
  • Safari(iOS):50K +
  • Internet Explorer 11: 失败 介于2,025和2,050之间
  • Microsoft Edge: 失败 介于2,025和2,050之间

因此,无论其他浏览器支持什么,如果您需要支持Microsoft Edge或IE11,那么您将需要保持在2,025个字符哈希值以下。 由于IE(因此我猜测Edge)历史上有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 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    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>

答案 1 :(得分:-1)

这种误导性的解释。 Hash没有大小限制,可以随意使用它。请记住,它不是网址部分。

答案 2 :(得分:-3)

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

这通常不包括哈希部分,所以我认为没有标准。

我想指出片段标识符通常用于标识文档的片段,不应该用于存储应用的整个状态。 您应该使用localstorage代替。

如果您希望能够共享或加入书签,请考虑在服务器端存储应用程序的状态,并使用片段标识符存储存储状态的ID。