Come puoi verificare la presenza di un #hash in un URL usando JavaScript?


783

Ho del codice jQuery / JavaScript che voglio eseguire solo quando c'è un #collegamento di ancoraggio hash ( ) in un URL. Come puoi verificare questo personaggio usando JavaScript? Ho bisogno di un semplice test generale che rilevi URL come questi:

  • example.com/page.html#anchor
  • example.com/page.html#anotheranchor

Fondamentalmente qualcosa sulla falsariga di:

if (thereIsAHashInTheUrl) {        
    do this;
} else {
    do this;
}

Se qualcuno potesse indicarmi la giusta direzione, sarebbe molto apprezzato.

Risposte:


1406

Semplice:

if(window.location.hash) {
  // Fragment exists
} else {
  // Fragment doesn't exist
}

43
Ulteriore: l'oggetto .location è disponibile solo sull'URL della finestra corrente, non è possibile farlo per un URL arbitrario (ad es. Uno memorizzato in una variabile stringa)
Gareth,

64
Inoltre, le proprietà della posizione come .hash e .query sono disponibili anche su <a> elementi
Gareth

19
.searchè disponibile su an <a>, no .query. JQuery campione: $("<a/>").attr({ "href": "http://www.somewhere.com/a/b/c.html?qs=1#fragmenttest" })[0]. .hash => "#fragmenttest"e .search= ?qs=1. Da lì, raggiungi la domanda di estrazione della querystring per ottenere qualcosa di diverso da una stringa.
Patridge,

1
@hitautodestruct: questa domanda non riguarda le modifiche all'hash, solo se si è presenti al caricamento della pagina o meno.
Gareth,

2
@Gareth Sì, hai ragione. Ho appena realizzato che il link che ho pubblicato era per l' hashchangeevento e non window.location.hash. Sebbene quest'ultimo non sia supportato da IE <8.
hitautodestruct

334
  if(window.location.hash) {
      var hash = window.location.hash.substring(1); //Puts hash in variable, and removes the # character
      alert (hash);
      // hash found
  } else {
      // No hash found
  }

54

Metti il ​​seguente:

<script type="text/javascript">
    if (location.href.indexOf("#") != -1) {
        // Your code in here accessing the string like this
        // location.href.substr(location.href.indexOf("#"))
    }
</script>

1
Grazie, window.location.hash ha un valore solo se c'è un valore che segue il #. per esempio. //www.example.com# restituisce '' quando si controlla l'hash.
Jessy,

33

Se l'URI non è la posizione del documento, questo frammento farà ciò che desideri.

var url = 'example.com/page.html#anchor',
    hash = url.split('#')[1];

if (hash) {
    alert(hash)
} else {
    // do something else
}

+1 per Javascript che non sa cosa sia fuori dai limiti :)
Dunc,

2
@Dunc: bene gli array JS sono fondamentalmente oggetti. Accedervi per indice è come l'accesso a una proprietà dell'oggetto in questo modo: obj['0']. In JS questo è vero: arr[0] === arr['0']quindi se l'indice / chiave non esiste, il valore restituito è indefinito anziché fuori dai limiti. jsfiddle.net/web5me/Mw376
Marc Diethelm,

21

Hai provato questo?

if (url.indexOf('#') !== -1) {
    // Url contains a #
}

(Dov'è urll'URL che vuoi controllare, ovviamente.)


17
$('#myanchor').click(function(){
    window.location.hash = "myanchor"; //set hash
    return false; //disables browser anchor jump behavior
});
$(window).bind('hashchange', function () { //detect hash change
    var hash = window.location.hash.slice(1); //hash to string (= "myanchor")
    //do sth here, hell yeah!
});

Questo risolverà il problema;)


Mi è piaciuta questa risposta grazie alla combinazione di JS + JQ, cross-browser e soluzione semplice, già implementato questo approccio.
Arthur Kushman,

13
window.location.hash 

restituirà l'identificatore hash


Breve e pulito, è perfetto
Jam


6

Ecco cosa puoi fare per controllare periodicamente la presenza di un cambiamento di hash, quindi chiamare una funzione per elaborare il valore di hash.

var hash = false; 
checkHash();

function checkHash(){ 
    if(window.location.hash != hash) { 
        hash = window.location.hash; 
        processHash(hash); 
    } t=setTimeout("checkHash()",400); 
}

function processHash(hash){
    alert(hash);
}

11
questo è essenziale solo per 6 + 7. Tutti gli altri browser hanno incluso l'evento
onhashchange

@Tokimon - fantastico! Non lo sapevo. Ma immagino che dobbiamo ancora supportare quelle vecchie versioni di IE
Emmanuel,

1
Sì, purtroppo ... Anche IE 8 non andrà via presto poiché IE 9 non è supportato su XP :(
Tokimon

1
modernizr.com implementa l'evento hashchange sui browser più vecchi (insieme a un sacco di altre funzionalità moderne)
guigouz,

4
Questo non è un codice raccomandato a tutti: si dovrebbe almeno essere: setTimeout(checkHash, 400). Inoltre, i browser moderni hanno l' hashchangeevento in modo che tu possa fare un window.addEventListener('hashchange', function(){ … }). Infine, trapelare la hashvariabile globale è un'altra pratica non raccomandata, anche per un esempio.
Oncle Tom,

5

Molte persone sono a conoscenza delle proprietà dell'URL in document.location. È fantastico se sei interessato solo alla pagina corrente. Ma la domanda era di poter analizzare le ancore su una pagina e non sulla pagina stessa.

Ciò che la maggior parte delle persone sembra perdere è che quelle stesse proprietà URL siano disponibili anche per ancorare elementi:

// To process anchors on click    
jQuery('a').click(function () {
   if (this.hash) {
      // Clicked anchor has a hash
   } else {
      // Clicked anchor does not have a hash
   }
});

// To process anchors without waiting for an event
jQuery('a').each(function () {
   if (this.hash) {
      // Current anchor has a hash
   } else {
      // Current anchor does not have a hash
   }
});

5
function getHash() {
  if (window.location.hash) {
    var hash = window.location.hash.substring(1);

    if (hash.length === 0) { 
      return false;
    } else { 
      return hash; 
    }
  } else { 
    return false; 
  }
}

3
Non dovrebbe essere "hash.length" in contrapposizione a "hash.length ()"? :)
Nathan Pitman,

4
var requestedHash = ((window.location.hash.substring(1).split("#",1))+"?").split("?",1);

3

I commenti di Partridge e Gareths sopra sono fantastici. Meritano una risposta separata. Apparentemente, le proprietà di hash e ricerca sono disponibili su qualsiasi oggetto html Link:

<a id="test" href="foo.html?bar#quz">test</a>
<script type="text/javascript">
   alert(document.getElementById('test').search); //bar
   alert(document.getElementById('test').hash); //quz
</script>

O

<a href="bar.html?foo" onclick="alert(this.search)">SAY FOO</a>

Se hai bisogno di questo su una normale variabile stringa e hai jQuery in giro, dovrebbe funzionare:

var mylink = "foo.html?bar#quz";

if ($('<a href="'+mylink+'">').get(0).search=='bar')) {
    // do stuff
}

(ma forse è un po 'esagerato ..)


3

Inserendolo qui come metodo per astrarre le proprietà della posizione da stringhe arbitrarie simili a URI. Sebbene window.location instanceof Locationsia vero, qualsiasi tentativo di invocazione Locationti dirà che è un costruttore illegale. È ancora possibile ottenere a cose come hash, query, protocolecc impostando la stringa come hrefproprietà di un elemento DOM di ancoraggio, che sarà poi condividere tutte le proprietà l'indirizzo con window.location.

Il modo più semplice per farlo è:

var a = document.createElement('a');
a.href = string;

string.hash;

Per comodità, ho scritto una piccola libreria che lo utilizza per sostituire il Locationcostruttore nativo con uno che prenderà stringhe e produrrà window.locationoggetti simili: Location.js


1

Di solito i clic vanno prima delle modifiche alla posizione, quindi dopo un clic è una buona idea impostareTimeOut per ottenere window.location.hash aggiornato

$(".nav").click(function(){
    setTimeout(function(){
        updatedHash = location.hash
    },100);
});

oppure puoi ascoltare la posizione con:

window.onhashchange = function(evt){
   updatedHash = "#" + evt.newURL.split("#")[1]
};

Ho scritto un plugin jQuery che fa qualcosa di simile a quello che vuoi fare.

È un semplice router di ancoraggio.


1

Ecco una semplice funzione che ritorna trueo false(ha / non ha un hashtag):

var urlToCheck = 'http://www.domain.com/#hashtag';

function hasHashtag(url) {
    return (url.indexOf("#") != -1) ? true : false;
}

// Condition
if(hasHashtag(urlToCheck)) {
    // Do something if has
}
else {
    // Do something if doesn't
}

ritorna true in questo caso.

Basato sul commento di @ jon-skeet.


0

Questo è un modo semplice per testarlo per l'URL della pagina corrente:

  function checkHash(){
      return (location.hash ? true : false);
  }

-2

a volte ottieni la stringa di query completa come "#anchorlink? firstname = mark"

questo è il mio script per ottenere il valore hash:

var hashId = window.location.hash;
hashId = hashId.match(/#[^?&\/]*/g);

returns -> #anchorlink

6
Non possibile poiché l'hash viene aggiunto dopo la stringa di query e non viene mai inviato al server. L'unico hash che appare prima della stringa di query è quando l'URL viene modificato manualmente.

1
sì, ma a volte le persone inviano URL in questo formato. questo è solo per poter ottenere solo il valore di hash e trascurare gli altri. :)
markg
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.