2012-03-31 16 views
22

Eventuali duplicati di URL:
What’s the shebang/hashbang (#!) in Facebook and new Twitter URLs for?Fare collegamenti come Twitter, Hash-Bang #!

Mi chiedevo come funziona Twitter i suoi collegamenti.

Se si guarda nel codice sorgente, si usano i collegamenti come/#!/I/connect o/#!/I/discover, ma non hanno una funzione JavaScript collegata come caricamento ('connect') o qualcosa, e che non richiede una ricarica della pagina. Cambia semplicemente il contenuto della pagina.

Ho visto la pagina this, ma poi tutti quei file avrebbero dovuto esistere e non potevi andare direttamente a uno di essi. Immagino che su Twitter ognuno di questi file non esista e che sia gestito in qualche altro metodo. Per favore correggimi se sbaglio, comunque.

C'è un modo per replicare questo effetto? Se è così, c'è un tutorial su come fare per fare questo?

+0

Quando contrassegni una domanda come duplicata, sarebbe utile con un riferimento al duplicato stesso. È questo quello che intendi? http://stackoverflow.com/questions/3009380/whats-the-shebang-hashbang-in-facebook-and-new-twitter-urls-for?lq=1 –

+0

Ora dovresti considerare seriamente la tua risposta accettata come @ BillBad ha spiegato che è eccezionalmente buono! –

+0

@Emin ok, l'ho fatto! Non guardare indietro a questa domanda in un attimo – ixchi

risposta

96

"Hash-Bang" navigazione, come viene talvolta chiamato, ...

http://whatever.com/path/to/#!/some-ajax-state 

... è una soluzione temporanea per un problema temporaneo che sta rapidamente diventando un non-problema grazie alla moderna standard del browser. Con ogni probabilità, Twitter lo eliminerà gradualmente, come già sta facendo Facebook.

E 'la combinazione di diversi concetti ...

In passato, un collegamento servita a due scopi: E' caricato un nuovo documento e/o scorrere verso il basso per un ancoraggio incorporato come indicato con il hash (#).

http://whatever.com/script.php#fourth-paragraph 

Tutto ciò in un URL dopo l'hash non è stato richiesto dal server, ma è stato cercato nella pagina dal browser. Tutto funziona ancora bene.

Con l'adozione di AJAX, è possibile caricare nuovi contenuti nella pagina corrente (già caricata). Con questo caricamento dinamico, sono sorti diversi problemi: 1) non c'era un URL univoco per il bookmarking o il collegamento a questo nuovo contenuto, 2) la ricerca non l'avrebbe mai visto.

Alcune persone intelligenti hanno risolto il primo problema utilizzando l'hash come una sorta di riferimento "stato" da includere nei collegamenti & segnalibri. Dopo il caricamento del documento, il browser legge l'hash ed esegue le richieste AJAX, visualizzando la pagina più le sue modifiche dinamiche AJAX.

http://whatever.com/script.php#some-ajax-state 

Questo risolto il problema AJAX, ma il problema al motore di ricerca ancora esisteva. I motori di ricerca non caricano pagine ed eseguono Javascript come un browser.

Google per il salvataggio. Google ha proposto uno schema in cui qualsiasi URL con hash-bang (#!) Al posto di un semplice hash (#) suggerirebbe al bot di ricerca che c'era un URL alternativo per l'indicizzazione, che includeva una variabile "_escaped_fragment_", tra gli altri cose. Leggi qui ...

https://developers.google.com/webmasters/ajax-crawling/docs/getting-started

Oggi, con l'adozione di pushState di JavaScript nella maggior parte dei browser principali, tutto questo sta diventando obsoleto. Con lo stato pushstate, poiché il contenuto viene caricato o modificato dinamicamente, l'URL della pagina corrente può essere modificato senza causare un caricamento della pagina. Se lo desideri, questo fornisce un vero URL di lavoro per la cronologia dei segnalibri &. I collegamenti possono quindi essere fatti come sempre, senza hashes & hash-bangs.

A partire da oggi, se carichi Facebook in un browser precedente, vedrai l'hash-bang, ma un browser corrente mostrerà l'uso di pushstate.

+2

risposta impressionante! Ho navigato su internet per l'ultima ora per capire l'intero concetto e l'hai spiegato così bene. –

+4

Non è obsoleto. In particolare se si dispone di un'applicazione (letterale) a pagina singola che modifica un url non funzionerà. È necessario configurare il server Web in modo che esegua tutte le richieste su una singola pagina dietro le quinte. – Caleb

+0

@Caleb Questo è molto, molto importante, e leggo sempre cose come "hashbang sono morti", ma spesso tutti trascurano quei piccoli dettagli. – user4052054

2

Si potrebbe voler controllare di più su Unique URLs.

Sta caricando la pagina tramite AJAX e analizzando l'hash (i valori che seguono il "#") per determinare la pagina che verrà caricata. Inoltre, questo metodo viene utilizzato a causa della natura che le richieste AJAX non contano per la cronologia del browser, quindi il "pulsante indietro si interrompe". Tuttavia, il browser memorizza nella cronologia le modifiche all'hash.

Utilizzando gli hash e il fatto che è possibile utilizzare gli hash per determinare le pagine, è possibile dire che è possibile mantenere le pagine richieste AJAX "nella cronologia". Aggiunto a questo, gli URL con hash sono solo URL e sono bookmarkable incluso l'hash, quindi puoi anche aggiungere ai preferiti le pagine richieste AJAX.

+0

Che dire di come Twitter ha il percorso/#!/URL? Questo aggiunge solo il #. Inoltre, c'è un esempio vivo di questo? – ixchi

+1

Se si desidera un esempio dal vivo, basta usare Twitter. 'window.location.hash' restituisce qualcosa dopo" # "(incluso l'hash) come' #!/i/connect' o '#!/i/discover'. Quindi puoi usare quella stringa per determinare quale posizione vuoi caricare tramite AJAX. Dipende dal sito come usano l'hash per determinare dove vanno. Non esiste una pratica standard su come analizzare i dati dopo l'hash. Nel caso di Twitter, inizia l'analisi dopo il primo '/'. solo digitando '/ #! /' o '/ #' carica semplicemente la pagina iniziale. – Joseph

+0

Sto guardando il codice relativo a window.location.has e non ho idea di cosa significhi. '(function() {var a = document.getElementsByTagName (" html ") [0], b = window.location.hash.split ("? ") [0], c = b.match (/ # /) && b .replace (/ # [!]? [\ /]? /, "")! == ""; c? a.className + = "remove-prerendered-content" :(a.className + = "usa-prerendered-content ", a.getAttribute (" data-nav-highlight-class-name ") && (a.className + =" "+ a.getAttribute (" data-nav-highlight-class-name ")))})(); ' – ixchi

Problemi correlati