2016-07-21 15 views
0

Wir verwenden die folgende Countdown-Funktion auf unserer Bietungsseite.jQuery-Countdown mit Update

setInterval(function(){ 
     $(".countdown").each(function(){ 
      var seconds = $(this).data('seconds'); 
      if(seconds > 0) { 
       second = seconds - 1; 
       $(this).data('seconds', second) 
       var date = new Date(null); 
       date.setSeconds(second); 
       $(this).html(date.toISOString().substr(11, 8)) 
      } 
      else 
      { 
       $(this).html("Finished"); 
    alert('finished'); 
      } 
     }); 
    }, 1000); 

passieren wir die Anzahl der Sekunden, wo wir der Zähler erscheinen soll (manchmal mehr als einmal auf unserer Seite:

echo "<div id=\"".$auctionid."\" class=\"countdown\" data-seconds=\"".$diff."\"></div>"; 

Bisher sollte klar sein, ein es funktioniert Jetzt haben wir ein. Situation, wenn jemand irgendwo auf der Website bietet - die verbleibende Zeit für die Auktion verlängert sich um 15 Sekunden, die in mysql geschrieben wird

$ diff Variable wird aus mysql Endzeit berechnet, und es wird an jQuery beim Laden der Seite übergeben.

Die Frage ist, wie die mysql Zeit für diese Auktion zu überprüfen und in jQuery Counter zu synchronisieren? Wir hatten die Idee, vielleicht alle 5 Sekunden zu überprüfen, und nachdem es Null erreicht, um sicherzustellen, dass es vorbei ist? Irgendwelche Vorschläge?

Es sollte für den Benutzer nett aussehen.

EDIT:

Das ist, was wir haben bisher:

$(".countdown").each(function() { 

     var countdown = $(this); 
     var auctionid = $(this).attr('id'); 

      var interval = setInterval(function() { 

         var seconds = countdown.data("seconds"); 

         if(seconds > 0) { 

          var second = --seconds; 
          var date = new Date(null); 
          date.setSeconds(second); 
          countdown.data("seconds", second).html(date.toISOString().substr(11, 8)) 

         } else { 

         //  countdown.html("Finished <img src=\"loading.gif\" class=\"tempload\">"); 

          startUpdateingTimeFromDatabase(auctionid); 

          countdown.html("Finished"); 
          clearInterval(interval); 

         } 

      }, 1000); 

}); 





function startUpdateingTimeFromDatabase(auctionid) { 


      $.getJSON("timer.php?auctionid="+auctionid, function(response) { 
       // console.log(response.seconds); 

        $(".countdown#"+auctionid).data("seconds", response.seconds); 

        if(response.seconds > 0) { 
         // setTimeout(startUpdateingTimeFromDatabase(auctionid), 1000); 
        } else { 

        } 

      }); 


} 

Dieses einfach nicht tut, was wir tun müssen, um. Wir müssen die Sekunden (Abfrage startUpdatingTimeFromDatabase) jedes Mal aktualisieren, wenn sie Null erreicht. Jetzt denke ich, dass es zwei Ansätze gibt. Zuerst geben Sie einfach Sekunden über die Funktion startUpdatingTimeFromDatabase zurück und machen dann alles in der Hauptfunktion, zweitens aktualisieren Sie das div über startUpdatingTimeFromDatabase. Ich denke, zuerst wird es besser, aber ich kann einfach keinen Weg finden, es richtig zu machen.

Jede Hilfe wird geschätzt. Vielen Dank.

+0

nicht Ihr Problem jetzt zu lösen, aber ich habe für Sie eine Verbesserung. Schalte nicht alle Countdowns im SetInterval ab. Erstellen Sie einfach die Intervalle innerhalb der Schleife und Sie sind fertig. Dies würde die On-and-On-Suche vor den Elementen jede Sekunde verhindern. Zum Beispiel: https://jsfiddle.net/rwd23ooz/1/ – eisbehr

+0

ok, das ist nützlich. Eine Idee, die ich hatte, war einfach den Timer zu synchronisieren, sobald er Null erreicht? – Outlaw011

+0

Speichern Sie den aktuellen Termin in einer js-Variablen und überprüfen Sie nach jeweils 5 Iterationen/Sekunden, ob die Zeit ausgerichtet ist. Keine Notwendigkeit für Ajax-Anfragen in diesem Fall. – Nitin

Antwort

1

Sie speichern die Sekunden in den Elementen data. Also warum nicht die verbleibende Zeit vielleicht über ajax holen und einfach die neuen Sekunden an die Elemente weitergeben? Innerhalb des nächsten Intervalls werden alle Zeiten aktualisiert.

Etwas wie folgt aus:

$.get("yourGetRemainingTimeScript.php", {auctionId: 1}, function(response) { 
    $(".countdown").data("seconds", response.seconds); 
}); 

Wie Sie überprüfen und erhalten die verbleibende Zeit bis zu Ihnen ist. Sie können die Zeit für alle überall wieder einstellen.

$(".countdown").data("seconds", 1337); 

Ein weiterer Hinweis von meiner Seite: nicht Schleife alle Elemente mit each im setInterval. Erstellen Sie die Intervalle innerhalb der Schleife einmal. Dann muss Ihr Skript nicht immer wieder jede Sekunde nach den Elementen suchen.

Und löschen Sie das Intervall, wenn es fertig ist.

$(".countdown").each(function() { 
    var countdown = $(this); 
    var interval = setInterval(function() { 
     // do your stuff ... 

     // when finished stop the interval 
     if(finished) { 
      clearInterval(interval); 
     } 
    }, 1000); 
}); 

Full working example.

+0

Hallo, ich versuche das, aber deine Geige ist entweder unvollständig oder es ist nicht der Trick - ich habe versucht,

in HTML zum Testen hinzuzufügen, nichts passiert – Outlaw011

+0

Sorry, das war nur eine Demo, kein funktionierendes Beispiel. :) Ich habe es aktualisiert, siehe hier: https://jsfiddle.net/rwd23ooz/4/ – eisbehr

+0

Ok, das funktioniert, aber was ist mit mysql Sync Teil. Ich habe dein Beispiel mit .get versucht - nicht sicher, ob ich es richtig gemacht habe, aber bedeutet das, dass es jede Sekunde von mysql liest? Können Sie bitte erläutern, wie man das richtig macht? – Outlaw011