2013-04-27 15 views
9

Desidero utilizzare lo location.hash per codificare lo stato della mia app client, in modo tale che gli utenti possano facilmente aggiungere ai segnalibri e/o condividere l'app nel suo stato completo utilizzando l'URL.Dimensione massima location.hash nel browser

Ci sono alcuni argomenti (obsoleti) sulla lunghezza massima di un URL, in particolare i limiti in Internet Explorer. Tuttavia non è chiaro quale sia la dimensione massima di location.hash. Poiché l'hash esiste solo nel client, le limitazioni di http o server non sono rilevanti.

Ho fatto un semplice jsfiddle per testare questo: http://jsfiddle.net/Jz3ZA/. Sia in Chrome che in Firefox (Ubuntu 12.04) gli hash fino a 50K sembrano funzionare. Questo significa che potrei usarli per memorizzare lo stato o sto trascurando altre limitazioni?

+2

Non c'è alcuna norma per le restrizioni di dimensione di URL a tutti, quindi l'hash può teoricamente essere di qualsiasi lunghezza, ma non ci si può fidare quali particolari browser faranno (soprattutto IE). –

+0

Perché non memorizzi lo stato in un server? – Blender

+0

Ho eseguito il violino su Internet Explorer 11 e non riesce a lunghezza hash 3000 –

risposta

-2

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

Questo genere non comprende la parte di hash, però, quindi non credo che ci sia uno standard.

Vorrei sottolineare che l'identificatore di frammento viene in genere utilizzato per identificare un frammento di un documento e non deve essere utilizzato per memorizzare l'intero stato di un'app. Dovresti invece usare localstorage.

Se si desidera poter condividere o aggiungere un segnalibro, considerare l'archiviazione dello stato dell'app sul lato server e utilizzare l'identificativo del frammento per memorizzare l'ID dello stato memorizzato.

+3

La domanda era esplicitamente sulla parte hash, quindi questo non risponde alla domanda. – Jeroen

-1

Tale spiegazione fuorviante. Hash non ha semplicemente limiti di dimensioni e sentiti libero di usarlo quanto vuoi. Ricorda solo che non è una parte dell'URL.

+1

Non penso che sia vero.Wikipedia dice: * L'identificatore di frammento introdotto da un cancelletto # è l'ultima parte facoltativa di un URL per un documento. * – Jeroen

4

In base al proprio JS Fiddle (con una versione modificata di esso http://jsfiddle.net/Jz3ZA/18/ (vedere l'esempio di codice seguente)), è possibile testare molti browser per ottenere una linea di base efficace.

  • Chrome: 50K +
  • Firefox: 50K +
  • Safari (iOS): 50K +
  • Internet Explorer 11: non riesce tra il 2.025 e il 2.050
  • Microsoft Edge: Fails tra 2.025 e 2.050

Quindi indipendentemente da ciò che gli altri browser supportano, se hai bisogno di supportare Microsoft Edge o IE11 allora dovrai rimanere sotto 2.025 caratteri di hash. Dal momento che IE (e quindi sto indovinando Edge) ha storicamente avuto limitazioni di lunghezza dell'URL ... questo potrebbe dipendere anche dalla lunghezza dell'URL di base.

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>

Problemi correlati