【问题标题】:Max size of location.hash in browser浏览器中 location.hash 的最大大小
【发布时间】:2013-04-21 06:15:34
【问题描述】:

我想使用 location.hash 对我的客户端应用程序的状态进行编码,以便用户可以使用 URL 轻松地收藏和/或共享完整状态的应用程序。

关于 url 的最大长度有许多(过时的)主题,尤其是 Internet Explorer 中的限制。但是,尚不清楚location.hash 的最大大小是多少。因为散列只存在于客户端,所以不受http或服务器的限制。

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

【问题讨论】:

  • 对于 URL 的大小限制根本没有标准,因此哈希理论上可以是任意长度,但您不能相信特定浏览器会做什么(尤其是 IE)。
  • 为什么不将状态存储在服务器中?
  • 我在 Internet Explorer 11 上运行了你的小提琴,但它在哈希长度 3000 处失败

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


【解决方案1】:

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

  • 铬:50K+
  • 火狐: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>

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我认为这不是真的。维基百科说:由井号 # 引入的片段标识符是文档 URL 的可选最后部分。
    【解决方案3】:

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

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

    我想指出,片段标识符通常用于标识文档的片段,不应用于存储应用程序的整个状态。 你应该改用localstorage

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

    【讨论】:

    • 这个问题是关于哈希部分的,所以这不能回答这个问题。
    猜你喜欢
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 2011-04-19
    • 2014-06-13
    • 2017-08-08
    相关资源
    最近更新 更多