2010-09-08 6 views

risposta

31

No, è a disposizione del solo browser, in modo da avere a che fare con Javascript. Il server non può leggerlo.

Spiegazione:
Fondamentalmente la componente hash l'URL della pagina (la parte che segue il segno #) viene elaborato da solo il browser - il browser non passa mai al server. Questo fa tristemente parte dello standard HTML ed è lo stesso indipendentemente dal fatto che tu stia usando IE o qualsiasi altro browser (e per quello che riguarda PHP o qualsiasi altra tecnologia lato server).

Ecco cosa Wikipedia dice a questo proposito:

funzioni identificatore

il frammento in modo diverso rispetto al resto del URI: vale a dire, la sua elaborazione è esclusivamente sul lato client senza partecipazione dal server. Quando un agente (come un browser Web) richiede una risorsa da un server Web, l'agente invia l'URI al server, ma non invia il frammento. Invece, l'agente attende che il server invii la risorsa, quindi l'agente elabora la risorsa in base al valore del frammento. Nel caso più comune, l'agente scorre una pagina Web verso il basso fino all'elemento di ancoraggio che ha una stringa di attributo uguale al valore del frammento. Altri comportamenti del cliente sono possibili

+0

Beh, in realtà potresti 'urlencode ('#')' l'hash a "% 23" e poi 'urldecode ('% 23')' a "#" di nuovo sul server, quindi * * * viene trasferito al server. Questo non usa JavaScript, come richiesto da OP, ma PHP. Se non vuoi usare PHP, puoi scrivere "% 23" nel tuo codice HTML a mano ;-) –

+1

No @what, non è affidabile. Se l'hash fosse dopo una stringa di query, il '% 23' sarebbe semplicemente trattato come parte del valore cioè'? Foo = bar% 23what', farebbe in modo che il server interpreti letteralmente come $ foo = 'bar # cosa'. –

+0

@OliverWilliams ya approccio migliore è usare parametri di query –

7

http://tools.ietf.org/html/rfc2396#section-4

Quando si utilizza un riferimento URI svolgono un'azione di recupero sulla risorsa identificata , l'identificatore di frammento opzionale, separato dalla URI da un tratteggio incrociato (" # ") carattere, costituito da ulteriori informazioni di riferimento da interpretate dall'agente utente dopo l'azione di recupero ha s stato completato con successo. In quanto tale, è non parte di un URI, ma viene spesso utilizzato insieme a un URI.

+0

In conclusione, #MOREURL non viene inviato al server? Solo usando i metodi jQuery/AJAX/Javascript. –

+0

jQuery e AJAX non hanno nulla a che fare con questo. È accessibile solo tramite Javascript o eventualmente un altro linguaggio di scripting lato client. Non lato server. –

+0

OK Non server SIDE !, GRAZIE! –

3

Come il browser non invia l'hash al server di default, l'unico modo per farlo è quello di utilizzare un po 'di Javascript:

  1. Quando il form sostiene, afferrare l'hash (window.location.hash) e memorizzarlo in un campo di input nascosto lato server. Metti questo in un DIV con un id di "urlhash" in modo che possiamo trovarlo facilmente in seguito.

  2. Sul server è possibile utilizzare questo valore se è necessario fare qualcosa con esso. Puoi persino cambiarlo se necessario.

  3. In caricamento pagina sul client, verificare il valore di questo campo nascosto. Dovrai trovarlo tramite il DIV in cui è contenuto poiché l'ID generato automaticamente non sarà noto. Sì, si potrebbe fare qualche trucco qui con .ClientID ma abbiamo trovato più semplice usare il DIV wrapper in quanto permette a tutto questo Javascript di vivere in un file esterno e di essere usato in modo generico.

  4. Se il campo di input nascosto ha un valore valido, impostarlo come hash dell'URL (window.locaion.hash di nuovo) e/o eseguire altre azioni.

Abbiamo usato jQuery per semplificare la selezione del campo, ecc ... tutto sommato si finisce per essere un paio di jQuery chiama, uno per salvare il valore, e un altro per ripristinarlo.

Prima di presentare:

$("form").submit(function() { 
    $("input", "#urlhash").val(window.location.hash); 
}); 

al caricamento della pagina:

var hashVal = $("input", "#urlhash").val(); 
if (IsHashValid(hashVal)) { 
    window.location.hash = hashVal; 
} 

IsHashValid() può verificare la presenza di "indefinito" o altre cose che non si desidera gestire.

Inoltre, assicurarsi di utilizzare $ (document) .ready() in modo appropriato, ovviamente.

2

Vorrei estendere la risposta sul motivo PERCHÉ il frammento non è stato inviato al server. Perché è un comportamento intenzionale e desiderato. Diamo un'occhiata alla stringa URL nel suo complesso.

/path/to/element?query=string&for=server#?optional=fragment&for=browser <----- URI ----> <---- QUERY STRING ---> <----- FRAGMENT STRING ------>

URI specifica unica risorsa scaricati da un server

QUERY definisce le operazioni da eseguire dal server sulla risorsa

FRAMMENTO controlli del browser (applicazione) comportamento . Frammento deve essere utilizzato per lo stato dell'applicazione negozio che deve essere visibile all'utente in modo che l'utente possa inviare il collegamento a un altro utente per ottenere lo stesso stato dell'applicazione.

Frammento è l'unica parte dell'URL disponibile per implementare in modo trasparente applicazioni Web a pagina singola (che possono essere eseguite offline sul telefono cellulare, ad esempio). Pertanto non deve essere inviato al server.