Javascript e PHP: inviare variabili POST tramite scrittura dinamica del codice

Siccome ho implementato il contatore PHP che (se avete letto) utilizza un variabile POST per decidere se aumentarsi o no, ho avuto anche la necessità di trovare un modo per poter inserire dei link interni che mi inviasse la variabile POST che mi serviva.

Siccome ciò non avviene in modo esplicito tramite una query string (sarebbero variabili GET), non posso inserire i valori nell’attributo href del link.
Dopo un po’ di ricerche ho trovato una buona idea: inviare i dati utilizzando una form (nascosta) contenente le variabili da inviare, generando il submit tramite Javascript inserendo il codice nell’evento OnClick del link.


<form method="post" name="data_form" action="index.php">
	<!-- variabile per il contatore -->
	<input type="hidden" name="increase_counter" value="no" />
	<!-- variabile per la pagina da caricare -->
	<input type="hidden" name="p" value="pagina3" />
</form>
<!-- al click sul link, invio i dati della form (che ha metodo POST) -->
<!-- 'return false;' serve per "fermare" il link, che altrimenti, dopo l'esecuzione del codice in OnClick -->
<!-- cercherebbe di andare al documento pagina3, generando ovviamente un errore 404 -->
<a href="pagina3" onclick="document.data_form.submit(); return false;">Vai a pagina 3</a>

Ora però, nonostante il tutto funzionasse, mi trovavo a dover scrivere tutto il codice di una form ogni volta che inserivo un link. Ho quindi scritto una funzione che, prima di inviare il form, impostasse il giusto valore alle variabili a seconda dell’attributo href del link. In questo modo, utilizzo una sola form per tutti i link, con un bel risparmio di codice!


<!-- Nell'head della pagina, inserisco questo tag script: -->
<script language="javascript" type="text/javascript">
//la funzione ha un unico parametro, link_object, che viene passato usando 'this'
//questa rappresenta il link che è stato cliccato
function go_link (link_object) {
	//siccome ai link relativi viene aggiunto automaticamente l'url completo, lo tolgo
	document.data_form.p.value = link_object.href.replace("http://www.example.net/", "");
	document.data_form.submit();
}
</script>
....
....
<!-- All'inizio del body -->
<form method="post" name="data_form" action="index.php">
	<input type="hidden" name="increase_counter" value="no" />
	<input type="hidden" name="p" value="" />
</form>
....
....
<!-- Un link diventa quindi: -->
<a href="pagina3" onclick="go_link(this); return false;">Vai a pagina 3</a>

Una volta completata anche questa operazione, e mentre mi stavo approcciando a farlo in tutte le altre pagine, mi son detto: perchè non implementarlo nel motore PHP?
Così ho aggiunto il codice Javascript una volta sola per tutte le pagine (lo inserisce infatti la pagina PHP) e ho aggiunto una ulteriore funzione che al caricarsi della pagina aggiunge ai link interni (escludendo ancore e link esterni) l’attributo onload che richiama la funzione go_link()
In questo modo ho semplificato enormemente la cosa: riesco a lavorare in background (usando le variabili POST), senza dover riscrivere lo stesso codice per ogni link, grazie a Javascript.


<head>
<script language="javascript" type="text/javascript">
function insert_links_attributes () {
	//grazie all'array links, ho tutti i link contenuti nella pagina
	for (n in document.links) {
		//modifico il link solo se è interno (contiene quindi l'url del mio sito nell'attributo href
		//oppure se è un ancora (link a un punto diverso della stessa pagina, contraddistinto dal carattere #
		if ((document.links[n].href.indexOf("http://www.example.net/") != -1) && (document.links[n].href.indexOf("#") == -1)) {
	 		document.links[n].setAttribute("onclick", "go_link\(this\)\; return false\;", 0);
	 	}
	}
}
</script>
</head>
<!-- Chiamo la funzione insert_links_attributes una volta completato il caricamento della pagina -->
<body onload="insert_links_attributes();">

  • Qwertj

    Maledetti errori di battitura

  • topor

    Approcciando con due C…
    Per il resto mi fido ciecamente