
Originariamente inviata da
KillerWorm
Ciao, nel tuo script ci sono due occorrenze di cattiva programmazione che (assieme) sono la causa dell'errore che riscontri.
1) Dentro una funzione, quando si intende usare delle variabili locali, è sempre meglio dichiararle opportunamente con
l'istruzione var, diversamente tali variabili faranno riferimento al contesto globale.
2) Meglio evitare l'uso dello stesso nome variabile per definire variabili/oggetti diversi, ma usare sempre nomi ben distinti. Questo evita vari grattacapi.
Hai definito una funzione nominandola "giorni_differenza" e al suo interno hai valorizzato la variabile "giorni_differenza", pensando che questa fosse una nuova variabile mentre non hai fatto altro che sovrascrivere la funzione creata inizialmente. Questo è il motivo dell'errore che viene restituito.
Soluzione: definisci le variabili con
var e/o usa nomi variabile differenti. Sarebbe meglio comunque fare entrambe le cose.
Inoltre aggiungerei anche:
3) In vari casi l'uso di
document.write() potrebbe portare a diverse problematiche. Ad esempio, se questo è eseguito dopo che la pagina è stata caricata completamente, l'intero contenuto della pagina sarà sovrascritto. Ci sono poi altri casi per cui l'uso di quel metodo è definito una cattiva pratica. Ad ogni modo ti consiglierei invece l'uso di metodi per la manipolazione del DOM, uno potrebbe essere.
4) Spezzettare lo script all'interno del documento comporta una cattiva gestione dell'insieme. E' consigliabile concentrare tutto lo script, per quanto possibile, in un unico punto. Ad esempio, puoi mettere tutto alla fine del tag
<body>. E' chiaro che questo porta ad evitare l'uso di
document.write.
5) Quando posti del codice sul forum è opportuno usare gli appositi tag di formattazione (vedi
info utili nel regolamento di sezione).
Posto un esempio completo:
codice:
<!DOCTYPE HTML>
<html>
<head>
<title>Esempio</title>
<meta charset="utf-8">
<style type="text/css">
span{
color: Blue;
}
</style>
</head>
<body>
Giorni A: <span id="giorniA"></span>
<br>Giorni B: <span id="giorniB"></span>
<br>
<br>Altro valore inserito al click (cosa che non potrebbe essere fatta usando <i>document.write()</i>).
<br><input type="button" id="btnInserisciValore" value="Click Me">: <span id="giorniC"></span>
<script type="text/javascript">
document.getElementById('giorniA').innerHTML = giorni_differenza('11/02/2016');
document.getElementById('giorniB').innerHTML = giorni_differenza('11/02/2016');
document.getElementById('btnInserisciValore').onclick = function(){
document.getElementById('giorniC').innerHTML = giorni_differenza('01/01/2001');
}
function giorni_differenza(data){
var data_odierna = new Date()
, mese = data_odierna.getMonth()+1
, giorno = data_odierna.getDate()
, anno = data_odierna.getFullYear()
, anno1 = parseInt(data.substr(6),10)
, mese1 = parseInt(data.substr(3, 2),10)
, giorno1 = parseInt(data.substr(0, 2),10)
, dataok=new Date(anno1, mese1-1, giorno1)
, dataok2=new Date(anno, mese-1, giorno)
, differenza = dataok2-dataok
, giorni_differenza = new String(differenza/86400000)
;
return giorni_differenza;
}
</script>
</body>
</html>
Nota che (in questo esempio) per definire le variabili ho usato una forma contratta scrivendo un'unica istruzione
var iniziale e usando la virgola per separare le diverse variabili. Tutte queste saranno comunque definite come variabili locali, cioè come se ognuna di esse fosse dichiarata con
var.