login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Jquery divs (Opgelost)

Offline rredspike1 - 03/02/2014 16:50 (laatste wijziging 03/02/2014 17:02)
Avatar van rredspike1Lid Beste sitemasters,

Ik heb een while loop in php en deze laad gegevens vanuit de database o.a datum.

Nu heb ik een jquery countdown script alleen deze zou over alle divs binnen deze while loop moeten worden uitgevoerd alleen ik krijg dit niet goed voor elkaar.

Wat gaat er niet goed? Zou iemand mij kunnen helpen?



jQuery
  1. (function (e) {
  2. e.fn.countdown = function (t, n) {
  3. function i() {
  4. eventDate = Date.parse(r.date) / 1e3;
  5. currentDate = Math.floor(e.now() / 1e3);
  6. if (eventDate <= currentDate) {
  7. n.call(this);
  8. clearInterval(interval)
  9. }
  10. seconds = eventDate - currentDate;
  11. days = Math.floor(seconds / 86400);
  12. seconds -= days * 60 * 60 * 24;
  13. hours = Math.floor(seconds / 3600);
  14. seconds -= hours * 60 * 60;
  15. minutes = Math.floor(seconds / 60);
  16. seconds -= minutes * 60;
  17. days == 1 ? thisEl.find(".timeRefDays").text("dag") : thisEl.find(".timeRefDays").text("dagen");
  18. hours == 1 ? thisEl.find(".timeRefHours").text("uur") : thisEl.find(".timeRefHours").text("uur");
  19. minutes == 1 ? thisEl.find(".timeRefMinutes").text("min.") : thisEl.find(".timeRefMinutes").text("min.");
  20. seconds == 1 ? thisEl.find(".timeRefSeconds").text("sec.") : thisEl.find(".timeRefSeconds").text("sec.");
  21. if (r["format"] == "on") {
  22. days = String(days).length >= 2 ? days : "0" + days;
  23. hours = String(hours).length >= 2 ? hours : "0" + hours;
  24. minutes = String(minutes).length >= 2 ? minutes : "0" + minutes;
  25. seconds = String(seconds).length >= 2 ? seconds : "0" + seconds
  26. }
  27. if (!isNaN(eventDate)) {
  28. thisEl.find(".days").text(days);
  29. thisEl.find(".hours").text(hours);
  30. thisEl.find(".minutes").text(minutes);
  31. thisEl.find(".seconds").text(seconds)
  32. } else {
  33. alert("Invalid date. Example: 30 february 2014 15:50:00");
  34. clearInterval(interval)
  35. }
  36. }
  37. thisEl = e(this);
  38. var r = {
  39. date: null,
  40. format: null
  41. };
  42. t && e.extend(r, t);
  43. i();
  44. interval = setInterval(i, 1e3)
  45. }
  46. })(jQuery);
  47. $(document).ready(function () {
  48. function e() {
  49. var e = new Date;
  50. e.setDate(e.getDate() + 60);
  51. dd = e.getDate();
  52. mm = e.getMonth() + 1;
  53. y = e.getFullYear();
  54. futureFormattedDate = mm + "/" + dd + "/" + y;
  55. return futureFormattedDate
  56. }
  57.  
  58. $(document).ready(function ()
  59. {
  60. $('#countdown').each(function()
  61. {
  62. $(this).countdown(function()
  63. {
  64. date: $('.test', this).html(),
  65. format: "on"
  66. });
  67. });
  68. });
  69. });


  1. $sql = mysql_query("SELECT * FROM events ORDER BY id ASC LIMIT 4") or die (mysql_error());
  2.  
  3. while ($data = mysql_fetch_object($sql))
  4. {
  5. <td class="border shadow" valign="top">
  6. <div class="extra_info_small"> Event Name
  7. <div id="countdown">
  8. <div class="test" hidden>'.$data->datum.'</div>
  9. </div>
  10. </div>
  11. </td>';
  12. }

8 antwoorden

Gesponsorde links
Offline Thomas - 03/02/2014 17:22
Avatar van Thomas Moderator
Citaat:
alleen ik krijg dit niet goed voor elkaar


Wat gaat er mis? Welke foutmelding(en) krijg je? Heb je een (niet-)werkend voorbeeld? Welk (ongewenst) gedrag treedt op?

Je id-div zit in een while-loop, dat lijkt mij om te beginnen al niet optimaal .
Offline rredspike1 - 03/02/2014 17:28 (laatste wijziging 03/02/2014 17:35)
Avatar van rredspike1 Lid Ok FangorN, zou je dit eens uit willen leggen?
Citaat:
Je id-div zit in een while-loop, dat lijkt mij om te beginnen al niet optimaal


Citaat:
Wat gaat er mis? Welke foutmelding(en) krijg je? Heb je een (niet-)werkend voorbeeld? Welk (ongewenst) gedrag treedt op?


Ik heb geen (niet-)werkend voorbeeld, ook krijg ik geen foutmelding(en).
Het enige wat er mis gaat is, dat ik het countdown script slechts werkend krijg op 1 div i.p.v. 4 divs in de while loop.

Nu: Bijv.

Div 1
Countdown datum 1
2 uur, 22 minuten, 12 seconden.

Div 2
Countdown datum 2
00 uur, 00 minuten, 00 seconden.

Div 3
Countdown datum 3
00 uur, 00 minuten, 00 seconden.

Div 4
Countdown datum 4
00 uur, 00 minuten, 00 seconden.

Het zou als volgt moeten zijn, bijvoorbeeld
Div 1
Countdown datum 1
2 uur, 22 minuten, 12 seconden.

Div 2
Countdown datum 2
23 uur, 09 minuten, 58 seconden.

Div 3
Countdown datum 3
12 uur, 34 minuten, 57 seconden.

Div 4
Countdown datum 4
05 uur, 05 minuten, 05 seconden.
Offline Thomas - 03/02/2014 17:32 (laatste wijziging 03/02/2014 17:33)
Avatar van Thomas Moderator De waarde van een id-property moet uniek zijn binnen een document.

Als je het afdrukken hiervan in een loop stopt heb je een aanzienlijke kans (> 1 resultaten) dat deze div meerdere keren wordt afgedrukt...

Wellicht zijn je problemen al opgelost als je alleen de divs met de test-class afdrukt in de loop.

EDIT: spelling
Offline rredspike1 - 03/02/2014 20:32
Avatar van rredspike1 Lid nu krijg ik voor alle divs dezelfde datum, die die countdowned zegmaar
Offline Wijnand - 04/02/2014 12:54
Avatar van Wijnand Moderator Hoi Rredspike1,

Leuk om je weer is te 'spreken' :-). Weet je nog wie ik ben?

Verder, heb je weer even een stukje voorbeeld code wat je nu precies hebt?
Offline rredspike1 - 04/02/2014 19:06 (laatste wijziging 04/02/2014 19:08)
Avatar van rredspike1 Lid He Wijnand, jazeker weet ik dat nog en ik moet nog weleens aan onze contact tijd denken en onze gesprekken.

Leuk om jou ook weer eens te spreken.

Wat betreft de code is er eigenlijk niet veel veranderd, behalve dat ik gedaan heb wat FangorN zei.

Ik heb die $('#countdown').countdown veranderd in een class ipv een id.

  1. $('.countdown').countdown(
  2. {
  3. date: $('.test').html(),
  4. format: "on"
  5. });


Nu telt het script bij alle 4 de divs terug, alleen vanaf 1 datum uit de database en dit zouden eigenlijk 4 verschillende soorten datums moeten zijn.
Offline Thomas - 05/02/2014 12:13 (laatste wijziging 05/02/2014 14:51)
Avatar van Thomas Moderator EDIT: ik denk dat het voornaamste probleem is dat de countdown functie zich niet bewust is van het element waarop deze zou moeten werken, deze zit min of meer in de "globale scope" (denk ik).

Daarom werkt een .each() loop dus niet, deze overschrijft (lijkt het op?) alle datums naar de laatste datum in het rijtje van events, althans met code die ik heb zelf moeten (her)construeren omdat het oorspronkelijke voorbeeld incompleet was (waar zijn de sub-elementen met classes days, hours, minutes, seconds, timeRefDays, timeRefHours, timeRefMinutes, timeRefSeconds ???). Je hebt ons dus een puzzel gegeven, maar niet alle stukken...

Heb je de oorspronkelijke code ergens vandaan gevist, of zelf geschreven / en zelf aangepast?

Long story short: deze code leent zich, voor zover ik kan overzien en na lang proberen, NIET voor meerdere counters op eenzelfde pagina. Je moet dan aan een andere opzet gaan denken...

EDIT2: al gegoogled naar jquery countdown? inspiratie te over

EDIT3: werkende (herschreven) variant:

  1. <!DOCTYPE html>
  2. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  3. <title>Insert title here</title>
  4. <script type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
  5. </head>
  6.  
  7. <div class="countdown-container">
  8. <div class="event"> Event Name #1
  9. <div class="countdown-box">
  10. <span class="days"></span> <span class="timeRefDays"></span>
  11. <span class="hours"></span> <span class=timeRefHours></span>
  12. <span class="minutes"></span> <span class="timeRefMinutes"></span>
  13. <span class="seconds"></span> <span class="timeRefSeconds"></span>
  14. <div class="event-date" hidden="hidden">2014-02-07 14:50:10</div>
  15. </div>
  16. </div>
  17.  
  18. <div class="event"> Event Name #2
  19. <div class="countdown-box">
  20. <span class="days"></span> <span class="timeRefDays"></span>
  21. <span class="hours"></span> <span class=timeRefHours></span>
  22. <span class="minutes"></span> <span class="timeRefMinutes"></span>
  23. <span class="seconds"></span> <span class="timeRefSeconds"></span>
  24. <div class="event-date" hidden="hidden">2015-04-28 12:00:00</div>
  25. </div>
  26. </div>
  27. </div>
  28.  
  29. <script type="text/javascript">
  30. //<![CDATA[
  31. $().ready(function() {
  32. // countdown definition
  33. function countdown() {
  34. this.$box = false;
  35. this.currentDate = false;
  36. this.eventDate = false;
  37. this.timer = false;
  38.  
  39. this.init = function(box) {
  40. this.$box = box;
  41.  
  42. // fetch event date
  43. this.eventDate = this.parseDate(this.$box.find('.event-date').html());
  44.  
  45. // initial call, so we don't have to wait a second for anything to show
  46. this.updateCountdown();
  47. // only call setInterval ONCE
  48. var that = this;
  49. this.timer = setInterval(function() {
  50. that.updateCountdown();
  51. }, 1000);
  52. }
  53. this.updateCountdown = function() {
  54. this.currentDate = Date.now(); // faster than new Date() apparently
  55. // calculations
  56. if (this.eventDate >= this.currentDate) {
  57. seconds = Math.round((this.eventDate - this.currentDate)/1000);
  58. days = Math.floor(seconds / 86400);
  59. seconds -= days * 60 * 60 * 24;
  60. hours = Math.floor(seconds / 3600);
  61. seconds -= hours * 60 * 60;
  62. minutes = Math.floor(seconds / 60);
  63. seconds -= minutes * 60;
  64. } else {
  65. days = 0;
  66. hours = 0;
  67. minutes = 0;
  68. seconds = 0;
  69. if (this.timer) {
  70. clearInterval(this.timer); // countdown complete
  71. }
  72. }
  73.  
  74. // formatting
  75. days = String(days).length >= 2 ? days : "0" + days;
  76. hours = String(hours).length >= 2 ? hours : "0" + hours;
  77. minutes = String(minutes).length >= 2 ? minutes : "0" + minutes;
  78. seconds = String(seconds).length >= 2 ? seconds : "0" + seconds;
  79.  
  80. // printing
  81. this.$box.find(".days").text(days);
  82. this.$box.find(".hours").text(hours);
  83. this.$box.find(".minutes").text(minutes);
  84. this.$box.find(".seconds").text(seconds);
  85.  
  86. days == 1 ? this.$box.find(".timeRefDays").text("dag") : this.$box.find(".timeRefDays").text("dagen");
  87. hours == 1 ? this.$box.find(".timeRefHours").text("uur") : this.$box.find(".timeRefHours").text("uur");
  88. minutes == 1 ? this.$box.find(".timeRefMinutes").text("min.") : this.$box.find(".timeRefMinutes").text("min.");
  89. seconds == 1 ? this.$box.find(".timeRefSeconds").text("sec.") : this.$box.find(".timeRefSeconds").text("sec.");
  90. }
  91.  
  92. // @see http://stackoverflow.com/questions/2587345/javascript-date-parse
  93. // input is of the form yyyy-mm-dd hh:ii:ss
  94. this.parseDate = function(input) {
  95. var dateParts = input.split(' ');
  96. var date = dateParts[0].split('-');
  97. var time = dateParts[1].split(':');
  98. return new Date(date[0], date[1]-1, date[2], time[0], time[1], time[2]); // months are zero-based
  99. }
  100. }
  101.  
  102. // start all countdowns
  103. $('.countdown-container .event').each(function() {
  104. var cd = new countdown();
  105. cd.init($(this));
  106. });
  107. });
  108. //]]>
  109. </body>
  110. </html>
Bedankt door: rredspike1
Offline rredspike1 - 05/02/2014 16:36
Avatar van rredspike1 Lid Heel erg bedankt voor je tijd om dit te scripten FangorN!! Werkt perfect!

Ik had dit script inderdaad van het internet alleen kon het niet goed aanpassen ook al heb ik veel gezocht alleen kwam niet op de oplossing, omdat ik jQuery nog niet goed genoeg ken.

Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.182s