Максимальный размер location.hash в браузере

Я хотел бы использовать location.hash для кодирования состояния моего клиентского приложения, чтобы пользователи могли легко добавлять закладки и/или совместно использовать приложение в своем полном состоянии, используя URL-адрес.

Существует несколько (устаревших) тем на максимальной длине URL-адреса, особенно в Internet Explorer. Однако неясно, каков максимальный размер location.hash. Поскольку хэш существует только в клиенте, ограничения HTTP или серверов не имеют отношения к делу.

Я сделал простой jsfiddle, чтобы проверить это: http://jsfiddle.net/Jz3ZA/. Как в Chrome, так и в Firefox (Ubuntu 12.04) хеши до 50K, похоже, работают. Означает ли это, что я могу использовать их для хранения состояния, или я не замечаю других ограничений?

Ответ 1

Основываясь на вашем 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, вам нужно будет оставаться под 2025 символами. Поскольку 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

Такое вводящее в заблуждение объяснение. У хэша просто нет ограничений по размеру и вы можете использовать его столько, сколько хотите. Просто помните, что это не часть url.

Ответ 3

Какова максимальная длина URL-адреса в разных браузерах?

Обычно это не включает хеш-часть, поэтому я не думаю, что есть стандарт.

Я хотел бы указать, что идентификатор фрагмента обычно используется для идентификации фрагмента документа и не должен использоваться для хранения всего состояния приложения. Вместо этого вы должны использовать localstorage.

Если вы хотите поделиться или закладок, подумайте о сохранении состояния приложения на стороне сервера и используйте идентификатор фрагмента для хранения идентификатора сохраненного состояния.