Jquery divs (Opgelost)
rredspike1 - 03/02/2014 16:50 (laatste wijziging 03/02/2014 17:02)
Lid
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
(function (e) {
e.fn.countdown = function (t, n) {
function i() {
eventDate = Date.parse(r.date) / 1e3;
currentDate = Math.floor(e.now() / 1e3);
if (eventDate <= currentDate) {
n.call(this);
clearInterval(interval)
}
seconds = eventDate - currentDate;
days = Math.floor(seconds / 86400);
seconds -= days * 60 * 60 * 24;
hours = Math.floor(seconds / 3600);
seconds -= hours * 60 * 60;
minutes = Math.floor(seconds / 60);
seconds -= minutes * 60;
days == 1 ? thisEl.find(".timeRefDays").text("dag") : thisEl.find(".timeRefDays").text("dagen");
hours == 1 ? thisEl.find(".timeRefHours").text("uur") : thisEl.find(".timeRefHours").text("uur");
minutes == 1 ? thisEl.find(".timeRefMinutes").text("min.") : thisEl.find(".timeRefMinutes").text("min.");
seconds == 1 ? thisEl.find(".timeRefSeconds").text("sec.") : thisEl.find(".timeRefSeconds").text("sec.");
if (r["format"] == "on") {
days = String(days).length >= 2 ? days : "0" + days;
hours = String(hours).length >= 2 ? hours : "0" + hours;
minutes = String(minutes).length >= 2 ? minutes : "0" + minutes;
seconds = String(seconds).length >= 2 ? seconds : "0" + seconds
}
if (!isNaN(eventDate)) {
thisEl.find(".days").text(days);
thisEl.find(".hours").text(hours);
thisEl.find(".minutes").text(minutes);
thisEl.find(".seconds").text(seconds)
} else {
alert("Invalid date. Example: 30 february 2014 15:50:00");
clearInterval(interval)
}
}
thisEl = e(this);
var r = {
date: null,
format: null
};
t && e.extend(r, t);
i();
interval = setInterval(i, 1e3)
}
})(jQuery);
$(document).ready(function () {
function e() {
var e = new Date;
e.setDate(e.getDate() + 60);
dd = e.getDate();
mm = e.getMonth() + 1;
y = e.getFullYear();
futureFormattedDate = mm + "/" + dd + "/" + y;
return futureFormattedDate
}
$(document).ready(function ()
{
$('#countdown').each(function()
{
$(this).countdown(function()
{
date: $('.test', this).html(),
format: "on"
});
});
});
});
( function ( e) {
e.fn .countdown = function ( t, n) {
function i( ) {
eventDate = Date.parse ( r.date ) / 1e3;
currentDate = Math.floor ( e.now ( ) / 1e3) ;
if ( eventDate <= currentDate) {
n.call ( this ) ;
clearInterval( interval)
}
seconds = eventDate - currentDate;
days = Math.floor ( seconds / 86400 ) ;
seconds -= days * 60 * 60 * 24 ;
hours = Math.floor ( seconds / 3600 ) ;
seconds -= hours * 60 * 60 ;
minutes = Math.floor ( seconds / 60 ) ;
seconds -= minutes * 60 ;
days == 1 ? thisEl.find ( ".timeRefDays" ) .text ( "dag" ) : thisEl.find ( ".timeRefDays" ) .text ( "dagen" ) ;
hours == 1 ? thisEl.find ( ".timeRefHours" ) .text ( "uur" ) : thisEl.find ( ".timeRefHours" ) .text ( "uur" ) ;
minutes == 1 ? thisEl.find ( ".timeRefMinutes" ) .text ( "min." ) : thisEl.find ( ".timeRefMinutes" ) .text ( "min." ) ;
seconds == 1 ? thisEl.find ( ".timeRefSeconds" ) .text ( "sec." ) : thisEl.find ( ".timeRefSeconds" ) .text ( "sec." ) ;
if ( r[ "format" ] == "on" ) {
days = String( days) .length >= 2 ? days : "0" + days;
hours = String( hours) .length >= 2 ? hours : "0" + hours;
minutes = String( minutes) .length >= 2 ? minutes : "0" + minutes;
seconds = String( seconds) .length >= 2 ? seconds : "0" + seconds
}
if ( ! isNaN( eventDate) ) {
thisEl.find ( ".days" ) .text ( days) ;
thisEl.find ( ".hours" ) .text ( hours) ;
thisEl.find ( ".minutes" ) .text ( minutes) ;
thisEl.find ( ".seconds" ) .text ( seconds)
} else {
alert ( "Invalid date. Example: 30 february 2014 15:50:00" ) ;
clearInterval( interval)
}
}
thisEl = e( this ) ;
var r = {
date: null ,
format: null
} ;
t && e.extend ( r, t) ;
i( ) ;
interval = setInterval( i, 1e3)
}
} ) ( jQuery) ;
$( document) .ready ( function ( ) {
function e( ) {
var e = new Date;
e.setDate ( e.getDate ( ) + 60 ) ;
dd = e.getDate ( ) ;
mm = e.getMonth ( ) + 1 ;
y = e.getFullYear ( ) ;
futureFormattedDate = mm + "/" + dd + "/" + y;
return futureFormattedDate
}
$( document) .ready ( function ( )
{
$( '#countdown' ) .each ( function ( )
{
$( this ) .countdown ( function ( )
{
date: $( '.test' , this ) .html ( ) ,
format: "on"
} ) ;
} ) ;
} ) ;
} ) ;
$sql = mysql_query("SELECT * FROM events ORDER BY id ASC LIMIT 4") or die (mysql_error());
while ($data = mysql_fetch_object($sql))
{
echo '
<td class="border shadow" valign="top">
<div class="extra_info_small"> Event Name
<div id="countdown">
<div class="test" hidden>'.$data->datum.'</div>
</div>
</div>
</td>';
}
{
<td class="border shadow" valign="top">
<div class="extra_info_small"> Event Name
<div id="countdown">
<div class="test" hidden>' . $data -> datum . '</div>
</div>
</div>
</td>' ;
}
8 antwoorden
Gesponsorde links
Thomas - 03/02/2014 17:22
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 .
rredspike1 - 03/02/2014 17:28 (laatste wijziging 03/02/2014 17:35)
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.
Thomas - 03/02/2014 17:32 (laatste wijziging 03/02/2014 17:33)
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
rredspike1 - 03/02/2014 20:32
Lid
nu krijg ik voor alle divs dezelfde datum, die die countdowned zegmaar
Wijnand - 04/02/2014 12:54
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?
rredspike1 - 04/02/2014 19:06 (laatste wijziging 04/02/2014 19:08)
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.
$('.countdown').countdown(
{
date: $('.test').html(),
format: "on"
});
$( '.countdown' ) .countdown (
{
date: $( '.test' ) .html ( ) ,
format: "on"
} ) ;
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.
Thomas - 05/02/2014 12:13 (laatste wijziging 05/02/2014 14:51)
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:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Insert title here</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
</head>
<body>
<div class="countdown-container">
<div class="event"> Event Name #1
<div class="countdown-box">
<span class="days"></span> <span class="timeRefDays"></span>
<span class="hours"></span> <span class=timeRefHours></span>
<span class="minutes"></span> <span class="timeRefMinutes"></span>
<span class="seconds"></span> <span class="timeRefSeconds"></span>
<div class="event-date" hidden="hidden">2014-02-07 14:50:10</div>
</div>
</div>
<div class="event"> Event Name #2
<div class="countdown-box">
<span class="days"></span> <span class="timeRefDays"></span>
<span class="hours"></span> <span class=timeRefHours></span>
<span class="minutes"></span> <span class="timeRefMinutes"></span>
<span class="seconds"></span> <span class="timeRefSeconds"></span>
<div class="event-date" hidden="hidden">2015-04-28 12:00:00</div>
</div>
</div>
</div>
<script type="text/javascript">
//<![CDATA[
$().ready(function() {
// countdown definition
function countdown() {
this.$box = false;
this.currentDate = false;
this.eventDate = false;
this.timer = false;
this.init = function(box) {
this.$box = box;
// fetch event date
this.eventDate = this.parseDate(this.$box.find('.event-date').html());
// initial call, so we don't have to wait a second for anything to show
this.updateCountdown();
// only call setInterval ONCE
var that = this;
this.timer = setInterval(function() {
that.updateCountdown();
}, 1000);
}
this.updateCountdown = function() {
this.currentDate = Date.now(); // faster than new Date() apparently
// calculations
if (this.eventDate >= this.currentDate) {
seconds = Math.round((this.eventDate - this.currentDate)/1000);
days = Math.floor(seconds / 86400);
seconds -= days * 60 * 60 * 24;
hours = Math.floor(seconds / 3600);
seconds -= hours * 60 * 60;
minutes = Math.floor(seconds / 60);
seconds -= minutes * 60;
} else {
days = 0;
hours = 0;
minutes = 0;
seconds = 0;
if (this.timer) {
clearInterval(this.timer); // countdown complete
}
}
// formatting
days = String(days).length >= 2 ? days : "0" + days;
hours = String(hours).length >= 2 ? hours : "0" + hours;
minutes = String(minutes).length >= 2 ? minutes : "0" + minutes;
seconds = String(seconds).length >= 2 ? seconds : "0" + seconds;
// printing
this.$box.find(".days").text(days);
this.$box.find(".hours").text(hours);
this.$box.find(".minutes").text(minutes);
this.$box.find(".seconds").text(seconds);
days == 1 ? this.$box.find(".timeRefDays").text("dag") : this.$box.find(".timeRefDays").text("dagen");
hours == 1 ? this.$box.find(".timeRefHours").text("uur") : this.$box.find(".timeRefHours").text("uur");
minutes == 1 ? this.$box.find(".timeRefMinutes").text("min.") : this.$box.find(".timeRefMinutes").text("min.");
seconds == 1 ? this.$box.find(".timeRefSeconds").text("sec.") : this.$box.find(".timeRefSeconds").text("sec.");
}
// @see http://stackoverflow.com/questions/2587345/javascript-date-parse
// input is of the form yyyy-mm-dd hh:ii:ss
this.parseDate = function(input) {
var dateParts = input.split(' ');
var date = dateParts[0].split('-');
var time = dateParts[1].split(':');
return new Date(date[0], date[1]-1, date[2], time[0], time[1], time[2]); // months are zero-based
}
}
// start all countdowns
$('.countdown-container .event').each(function() {
var cd = new countdown();
cd.init($(this));
});
});
//]]>
</script>
</body>
</html>
<!DOCTYPE html>
<meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" / > <script type = "text/javascript" src = "http://code.jquery.com/jquery-1.10.2.min.js" ></ script >
<div class = "countdown-container" > <div class = "event" > Event Name #1
<div class = "countdown-box" > <div class = "event-date" hidden= "hidden" > 2014-02-07 14:50:10
</ div >
<div class = "event" > Event Name #2
<div class = "countdown-box" > <div class = "event-date" hidden= "hidden" > 2015-04-28 12:00:00
</ div >
<script type = "text/javascript" > //<![ CDATA[
$( ) .ready( function( ) {
// countdown definition
function countdown( ) {
this.$box = false;
this.currentDate = false;
this.eventDate = false;
this.timer = false;
this.init = function( box) {
this.$box = box;
// fetch event date
this.eventDate = this.parseDate( this.$box.find( '.event-date' ) .html( ) ) ;
// initial call, so we don't have to wait a second for anything to show
this.updateCountdown();
// only call setInterval ONCE
var that = this;
this.timer = setInterval(function() {
that.updateCountdown();
}, 1000);
}
this.updateCountdown = function() {
this.currentDate = Date.now(); // faster than new Date() apparently
// calculations
if (this.eventDate > = this.currentDate) {
seconds = Math.round((this.eventDate - this.currentDate)/1000);
days = Math.floor(seconds / 86400);
seconds -= days * 60 * 60 * 24;
hours = Math.floor(seconds / 3600);
seconds -= hours * 60 * 60;
minutes = Math.floor(seconds / 60);
seconds -= minutes * 60;
} else {
days = 0;
hours = 0;
minutes = 0;
seconds = 0;
if (this.timer) {
clearInterval(this.timer); // countdown complete
}
}
// formatting
days = String(days).length >= 2 ? days : "0" + days;
hours = String(hours).length >= 2 ? hours : "0" + hours;
minutes = String(minutes).length >= 2 ? minutes : "0" + minutes;
seconds = String(seconds).length >= 2 ? seconds : "0" + seconds;
// printing
this.$box.find(".days").text(days);
this.$box.find(".hours").text(hours);
this.$box.find(".minutes").text(minutes);
this.$box.find(".seconds").text(seconds);
days == 1 ? this.$box.find(".timeRefDays").text("dag") : this.$box.find(".timeRefDays").text("dagen");
hours == 1 ? this.$box.find(".timeRefHours").text("uur") : this.$box.find(".timeRefHours").text("uur");
minutes == 1 ? this.$box.find(".timeRefMinutes").text("min.") : this.$box.find(".timeRefMinutes").text("min.");
seconds == 1 ? this.$box.find(".timeRefSeconds").text("sec.") : this.$box.find(".timeRefSeconds").text("sec.");
}
// @see http://stackoverflow.com/questions/2587345/javascript-date-parse
// input is of the form yyyy-mm-dd hh:ii:ss
this.parseDate = function(input) {
var dateParts = input.split(' ');
var date = dateParts[0].split('-');
var time = dateParts[1].split(':');
return new Date(date[0], date[1]-1, date[2], time[0], time[1], time[2]); // months are zero-based
}
}
// start all countdowns
$('.countdown-container .event').each(function() {
var cd = new countdown();
cd.init($(this));
});
});
//]]>
Bedankt door: rredspike1
rredspike1 - 05/02/2014 16:36
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.