我想使用location.hash
对我的客户端应用的状态进行编码,以便用户可以使用网址轻松地将应用标记和/或共享到完整状态。
网址的最大长度上有许多(过时的)主题,尤其是Internet Explorer中的限制。但是,不清楚location.hash
的最大大小是多少。由于哈希仅存在于客户端中,因此http或服务器的限制无关紧要。
我做了一个简单的jsfiddle来测试它:http://jsfiddle.net/Jz3ZA/。在Chrome和Firefox(Ubuntu 12.04)中,最多可以使用高达50K的哈希值。这是否意味着我可以使用它们来存储状态,还是我忽略了其他限制?
答案 0 :(得分:5)
基于你的JS Fiddle(以及它的修改版http://jsfiddle.net/Jz3ZA/18/(参见下面的代码示例)),你可以测试很多浏览器以获得有效的基线。
因此,无论其他浏览器支持什么,如果您需要支持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。