Il problema è che usi variabili globali che quindi si sovrascrivono ogni volta. In ogni caso, se fossi in te, io imposterei tutto diversamente…:
codice:
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>CountDown</title>
<script type="text/javascript">
function Timer (sId, nYear, nMonth, nDay, nHour, nMinute, nSeconds) {
if (arguments.length < 2) { throw new TypeError("Timer - not enough arguments"); }
var domNode = document.getElementById(sId);
this.expires = (new Date(nYear, nMonth - 1, nDay, nHour, nMinute, nSeconds)).getTime() || 0x1f3fffffc18;
this.id = sId;
if (domNode) { this.owner = domNode; }
Timer.instances.push(this);
}
Timer.refreshAll = function () {
for (var nDelta, nDLeft, nHLeft, nMLeft, nSLeft, oThis, oDisplay, nInst = 0; nInst < Timer.instances.length; nInst++) {
oThis = Timer.instances[nInst];
if (!oThis) { continue; }
if (oThis.hasOwnProperty("owner")) { oDisplay = oThis.owner }
else if (oDisplay = document.getElementById(oThis.id)) { oThis.owner = oDisplay; }
else { continue; }
nDelta = oThis.expires - Date.now();
// Casual expiration test
// if (Math.floor(Math.random() * 8) === 0) { nDelta = 0; }
if (nDelta <= 0) {
Timer.instances[nInst] = null;
oDisplay.innerHTML = "Tempo scaduto";
continue;
}
nDLeft = Math.floor(nDelta / 864e5);
nDelta -= (nDLeft * 864e5);
nHLeft = Math.floor(nDelta / 36e5);
nDelta -= (nHLeft * 36e5);
nMLeft = Math.floor(nDelta / 6e4);
nDelta -= (nMLeft * 6e4);
nSLeft = Math.floor(nDelta / 1e3);
nDelta -= (nSLeft * 1e3);
oDisplay.innerHTML = nDLeft + " giorni, " + nHLeft + " ore, " + nMLeft + " minuti e " + nSLeft + " secondi";
}
};
Timer.instances = [];
Timer.session = setInterval(Timer.refreshAll, 1000);
</script>
</head>
<body>
<div id="div2"></div>
<script>
var tdiv2 = new Timer("div2", 2019, 02, 26, 21, 00, 31);
</script>
<div id="div3"></div>
<script>
var tdiv3 = new Timer("div3", 2013, 04, 26, 23, 00, 00);
</script>
</body>
</html>