Tak, jako v PHP pracujeme s parametry oddělenými otazníkem a následně ampersandem (&), můžeme v JavaScriptu pracovat s kotvami. Nejčastější využití takzvané kotvy spočívá v odkazu na nadpis či odstavec dále v textu nebo přímý odkaz na aktivní záložku.

Pomocí hodnoty kotvy ale můžeme v kódu podmiňovat naprosto cokoli. Tak, jako query string ?arg=value&page=3 splní svůj účel, může pracovat i kotva ve tvaru #arg=value&page=neco. PHP takový řetězec v URL už rozpoznat nedokáže, kdežto JavaScript si z něj umí vzít potřebné hodnoty. Proměnná, kterou hledáme se skrývá v parametru hash objektu window.location. Ten obsahuje úplnou url včetně kotvy. Rozparsování je naprosto triviální, a tak můžeme začít s kotvou pracovat jako s plnohodnotným polem.

/**
 * vytahne a rozparsuje kotvu z url
 * [@param string url]
 * @return array 
 **/
function evil_get(url){
	if(url){
		var hash = (url.replace(/^(.*)#/, '')).replace(/(&)/, '&');
	}else{
		if(!document.location.hash){
			return {};
		}
		var hash = document.location.hash.replace(/^(.*)#/, '');
	}
	
	var get = {};
	if(hash){
		hash = hash.split('&');
		for(i = 0; i < hash.length; i++){
			hash[i] = (hash[i]).split('=');
			get[hash[i][0]] = (hash[i][1] ? hash[i][1] : null);
		}
	}
	return get;
}

var get_params = evil_get();

Funkce má ponděkud nezvyklý název z prostého důvodu: "get" je příliš obecné slovo a může se stát, že se bude hádat s definovanou funkcí nějakého frameworku nebo externí knihovny. A taky že se to stane. Naopak u názvu funkce s prefixem "evil_" se vám to dozajista nestane. Z nepovinného argumentu je také jasné, že můžeme parsovat i předanou hodnotu. 

Použití

Po rozparsování následujícího příkladu dostaneme pole ve tvaru:

// http://www.treba.cz/#arg=value&none&page=2

get_params = {
	arg : value,
	none : null,
	page : 2
};

if (get_params.arg == 'value') {
// ...
}

Proměnné bez definované hodnoty bude přiřazena automaticky hodnota null.

Tip

Sám používám tento způsob například pro cílení skrytých záložek. Navigace vede právě na kotvy, ale jelikož DOM neobsahuje žádný HTML element s takto podivným ID, stránka neposkočí. Hodnotu kotvy lze totiž v url libovolně měnit bez refreshe. Pak podle hodnoty proměnné, například #tab=main přidám aktivní třídu odkazu, který vede na div.tab.main, zobrazím div.tab.main a všechny ostatní divy definované jako .tab skryji.

Edit 28. 4. 2020: Funkci i po deseti letech stále používám, nicméně prošla drobným vývojem, takže upravuji článek.