Ma question est simple mais je ne trouve pas de solution. J'ai besoin d'un script de compte à rebours du serveur pour fonctionner pendant 10 minutes, exécuter un fichier php et à la fin du compte à rebours, recommencer. J'ai lu les scripts jQuery mais tous me fournissent un compte à rebours jusqu'à une date spéciffique puis s'arrêtent.

Quelqu'un peut-il m'orienter dans la bonne direction pour trouver un tel script?

Voilà ce que j'ai

  <style style="text/css">

.lcdstyle{ /*Example CSS to create LCD countdown look*/
background-color:black;
color:lime;
font: bold 18px MS Sans Serif;
padding: 3px;
}

.lcdstyle sup{ /*Example CSS to create LCD countdown look*/
font-size: 80%
}

</style>

<script type="text/javascript">



function cdLocalTime(container, servermode, offsetMinutes, targetdate, debugmode){
if (!document.getElementById || !document.getElementById(container)) return
this.container=document.getElementById(container)
var servertimestring=(servermode=="server-php")? '<? print date("F d, Y H:i:s", time())?>' : (servermode=="server-ssi")? '<!--#config timefmt="%B %d, %Y %H:%M:%S"--><!--#echo var="DATE_LOCAL" -->' : '<%= Now() %>'
this.localtime=this.serverdate=new Date(servertimestring)
this.targetdate=new Date(targetdate)
this.debugmode=(typeof debugmode!="undefined")? 1 : 0
this.timesup=false
this.localtime.setTime(this.serverdate.getTime()+offsetMinutes*60*1000) //add user offset to server time
this.updateTime()
}

cdLocalTime.prototype.updateTime=function(){
var thisobj=this
this.localtime.setSeconds(this.localtime.getSeconds()+1)
setTimeout(function(){thisobj.updateTime()}, 1000) //update time every second
}

cdLocalTime.prototype.displaycountdown=function(baseunit, functionref){
this.baseunit=baseunit
this.formatresults=functionref
this.showresults()
}

cdLocalTime.prototype.showresults=function(){
var thisobj=this
var debugstring=(this.debugmode)? "<p style=\"background-color: #FCD6D6; color: black; padding: 5px\"><big>Debug Mode on!</big><br /><b>Current Local time:</b> "+this.localtime.toLocaleString()+"<br />Verify this is the correct current local time, in other words, time zone of count down date.<br /><br /><b>Target Time:</b> "+this.targetdate.toLocaleString()+"<br />Verify this is the date/time you wish to count down to (should be a future date).</p>" : ""

var timediff=(this.targetdate-this.localtime)/1000 //difference btw target date and current date, in seconds
if (timediff<0){ //if time is up
this.timesup=true
this.container.innerHTML=debugstring+this.formatresults()
return
}
var oneMinute=60 //minute unit in seconds
var oneHour=60*60 //hour unit in seconds
var oneDay=60*60*24 //day unit in seconds
var dayfield=Math.floor(timediff/oneDay)
var hourfield=Math.floor((timediff-dayfield*oneDay)/oneHour)
var minutefield=Math.floor((timediff-dayfield*oneDay-hourfield*oneHour)/oneMinute)
var secondfield=Math.floor((timediff-dayfield*oneDay-hourfield*oneHour-minutefield*oneMinute))
if (this.baseunit=="hours"){ //if base unit is hours, set "hourfield" to be topmost level
hourfield=dayfield*24+hourfield
dayfield="n/a"
}
else if (this.baseunit=="minutes"){ //if base unit is minutes, set "minutefield" to be topmost level
minutefield=dayfield*24*60+hourfield*60+minutefield
dayfield=hourfield="n/a"
}
else if (this.baseunit=="seconds"){ //if base unit is seconds, set "secondfield" to be topmost level
var secondfield=timediff
dayfield=hourfield=minutefield="n/a"
}
this.container.innerHTML=debugstring+this.formatresults(dayfield, hourfield, minutefield, secondfield)
setTimeout(function(){thisobj.showresults()}, 1000) //update results every second
}

/////CUSTOM FORMAT OUTPUT FUNCTIONS BELOW//////////////////////////////

//Create your own custom format function to pass into cdLocalTime.displaycountdown()
//Use arguments[0] to access "Days" left
//Use arguments[1] to access "Hours" left
//Use arguments[2] to access "Minutes" left
//Use arguments[3] to access "Seconds" left

//The values of these arguments may change depending on the "baseunit" parameter of cdLocalTime.displaycountdown()
//For example, if "baseunit" is set to "hours", arguments[0] becomes meaningless and contains "n/a"
//For example, if "baseunit" is set to "minutes", arguments[0] and arguments[1] become meaningless etc

//1) Display countdown using plain text
function formatresults(){
if (this.timesup==false){//if target date/time not yet met
var displaystring="<span style='background-color: #CFEAFE'>"+arguments[2]+" minutes "+arguments[3]+" seconds</span> left until launch time"
}
else{ //else if target date/time met
var displaystring="Launch time!"
}
return displaystring
}

//2) Display countdown with a stylish LCD look, and display an alert on target date/time
function formatresults2(){
if (this.timesup==false){ //if target date/time not yet met
var displaystring="<span class='lcdstyle'>"+arguments[2]+" <sup>minutes</sup> "+arguments[3]+" <sup>seconds</sup></span> left until launch time"
}
else{ //else if target date/time met
var displaystring="" //Don't display any text
alert("Launch time!") //Instead, perform a custom alert
}
return displaystring
}

</script>  

<div id="cdcontainer"></div>

 <script type="text/javascript">
 //cdLocalTime("ID_of_DIV_container", "server_mode", LocaltimeoffsetMinutes, "target_date", "opt_debug_mode")
 //cdLocalTime.displaycountdown("base_unit", formatfunction_reference)

 //Note: "launchdate" should be an arbitrary but unique variable for each instance of a countdown on your page:

 var launchdate=new cdLocalTime("cdcontainer", "server-php", 0, "April 28, 5012 00:05:00", "debugmode")
 launchdate.displaycountdown("days", formatresults2)
 </script>

Des idées?

1
user631756 19 déc. 2011 à 03:32

3 réponses

Meilleure réponse

C'est le morceau qui initialise l'horloge à 30 minutes au chargement de la page:

$date = date('i');
$sec = date('s');
$diff = ($date < 30) ? 1800 - (($date * 60) + $sec) : 3600 - (($date * 60) + $sec); //set diff to run split on the half hour.
$hld_diff = $diff;

Ce qui se passe ici c'est

$date = date('i') //is taking the minutes portion of the current time
$sec = date('s') //is taking the seconds portion of the current time

La ligne suivante indique que si le nombre de minutes est inférieur à 30, définissez $ diff sur 1800 secondes (c'est-à-dire 30 minutes) moins l'heure et les minutes actuelles. En d'autres termes - définissez la valeur $ diff sur le nombre de secondes jusqu'à ce que l'heure actuelle atteigne 00 min 00 s. Si le nombre de minutes est supérieur ou égal à 30, effectuez une opération similaire mais définissez $ diff sur le nombre de minutes et de secondes jusqu'à ce que l'heure et les minutes et les secondes actuelles atteignent respectivement 30 et 0.

Donc, si vous souhaitez utiliser ce même code mais que vous souhaitez le définir sur 10 minutes, vous devez d'abord décider du nombre de minutes sur l'horloge que vous souhaitez que le compte à rebours se termine. Pour rester simple, nous dirons qu'il se terminera sur 0, 10, 20, 30, 40 et 50.

Vous pouvez donc faire quelque chose comme ceci:

if($date < 10)
  $diff = 600 - (($date * 60) + $sec);
else if($date < 20)
  $diff = 1200 - (($date * 60) + $sec);
else if($date < 30)
  $diff = 1800 - (($date * 60) + $sec);
else if($date < 40)
  $diff = 2400 - (($date * 60) + $sec);
else if($date < 50)
  $diff = 3000 - (($date * 60) + $sec);
else
  $diff = 3600 - (($date * 60) + $sec);

Cela devrait être tout ce dont vous avez besoin (sauf si j'ai oublié quelque chose)

2
TheOx 24 févr. 2012 à 02:42

C'est un compte à rebours pour un jeu, j'ai besoin d'un compte à rebours visuel pour savoir quand l'argent ou quoi va être ajouté.

En règle générale, vous n'écrivez pas cela en utilisant un compte à rebours "réel". La logique est assez simple pour programmer de façon "non temps réel". La prochaine fois que l'utilisateur se connecte / actualise la page / fait quelque chose, vous pouvez exécuter tous les calculs nécessaires pour fournir à l'utilisateur autant d'argent qu'il aurait dû recevoir depuis la dernière fois qu'il a consulté la page. Vous n'avez pas réellement à donner à l'utilisateur l'argent exactement après 10 minutes.

Pour de tels jeux, vous auriez généralement un travail cron / démon en cours d'exécution toutes les minutes environ qui recalcule tous les montants de tous les utilisateurs de cette manière. Le compte à rebours visuel n'est qu'un gadget côté client.

0
deceze 18 déc. 2011 à 23:45

Il semble que ce que vous voulez soit un tâche cron; qui peut exécuter un script à des moments ou des intervalles prédéfinis. La configuration d'un cron dépend un peu de l'environnement du serveur dans lequel vous l'exécutez.


Pour mettre à jour à l'aide d'un script de compte à rebours en JavaScript:

var count = 600;

function hitPhpScript() {
    var xhr = new XMLHttpRequest();
    xhr.open("get", "myscript.php", true);
    xhr.send(null);
    startCountdown();
}

function startCountdown() {
    count = 600;
    doCountdown();
}

function doCountdown() {
    count--;

    if (count > 0) {
        document.getElementById("countdown_label").innerHTML = count + " seconds left";
        setTimeout("doCountdown()", 1000);
    } else {
        hitPhpScript();
    }
}
3
Jon Newmuis 18 déc. 2011 à 23:52
8555707