Door
The Ultimate
op 19-12-2010 13:46
gewijzigd op 19-12-2010 14:58
9.520 views
Hallo,
Ik ben een total noob als het aankomt op javascript. So bare with me please...
Ik ben bezig met een website. Deze website maakt gebruik van een database. In deze database staan entries met geldbedragen. Deze geldbedragen laat ik de database bij elkaar optellen en dat is dus het bedragTotaal (o.i.d.). Het script en de database hiervoor moet ik nog maken.
Op deze website wil ik graag een realtime teller tonen (javascript?) die iedere seconde controleert wat het bedragTotaal is. Wanneer dit omhoog is gegaan dient de teller naar boven te worden bijgesteld. Het liefst zie ik dan de cijfers naar boven 'wegrollen' zoals je bij een gasmeter ook hebt. Dit zal dus een soort transitie of animatie moeten zijn.
Wie kan mij op weg helpen want ik heb gezocht, maar kom geen script tegen waar ik iets mee kan.
Helaas werkt het nog niet. Vreemd, want op de developers page werkt het uitstekend. Maar hoe kan ik er voor zorgen dat het script iedere seconde het bedragTotal controleert en optelt vanaf het huidige bedragTotal naar het nieuwe bedragTotal? En is het dan mogelijk om een soort van transitie toe te voegen? Bijvoorbeeld dat de eerste en laatste cijfers langzamer gaan dan de middelste?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>
<body>
<h1>Jquery Number Ticker - By Damien Howley</h1>
<div class="counter-wrap">
<div class="counter-number">
</div>
</div>
<div>
<style>
.counter-wrap {
height:18px;
overflow:hidden;
}
.counter-number {
height:198px;
width:12px;
position:relative;
background-image:url(img/counter_ticker_bg.gif);
float:left;
}
</style>
<a href="#" onclick="loadticker(0786554)">load ticker - 786554</a><br/><br/>
<a href="#" onclick="loadticker(01767697234789837)">load ticker - 1767697234789837</a><br/><br/>
<a href="#" onclick="loadticker(01988989)">load ticker - 1988989</a><br/><br/>
</div>
<script src="js/jquery-1.4.4.min.js" type="text/javascript"></script>
<script type="text/javascript">
Deki.$(".counter-number").each( function(i) {
Deki.$(this).attr('id','num'+i);
});
function loadinput() {
var newval = Deki.$("#numgo").val();
loadticker(newval);
}
function loadticker(ticnum) {
var fticnum = add_commas(ticnum);
var numheight=18;
addticker(fticnum);
if (ticnum && ticnum != 0) {
var s = String(fticnum);
for (i=s.length;i>=0; i--)
{
var onum=s.charAt(i);
Deki.$("#num"+i).attr('value',onum);
}
Deki.$(".counter-number").each( function() {
var nval=Deki.$(this).attr("value");
if (!isNaN(nval)) {
var nheight = Number(nval)*numheight*-1;
Deki.$(this).animate({ top: nheight+'px'}, 1500 );
}
if (nval==','){
Deki.$(this).animate({ top: '-180px'}, 1500 );
}
});
}
}
function addticker(newnum) {
var digitcnt = Deki.$(".counter-number").size();
var nnum = String(newnum).length;
var digitdiff = Number(nnum - Number(digitcnt));
if (digitdiff <0) {
var ltdig = (Number(nnum)-1);
Deki.$(".counter-number:gt(" + ltdig + ")").remove();
}
for(i=1;i<=digitdiff;i++) {
Deki.$(".counter-wrap").append('<div class="counter-number" id="num' + (Number(digitcnt+i-1)) + '"> </div>');
}
}
function add_commas(nStr) {
nStr += '';
x = nStr.split('.');
x1 = x[0];
x2 = x.length > 1 ? '.' + x[1] : '';
var rgx = /(\d+)(\d{3})/;
while (rgx.test(x1)) {
x1 = x1.replace(rgx, '$1' + ',' + '$2');
}
return x1 + x2;
}
</script>
</body>
</html>
* elke seconde checken: zet een timer in javascript met setInterval; doe in de functie die je dan aanroept een ("ajax")oproep naar je server die je een bedragTotaal kan geven. Wijkt dat af van je huidige, dat je ergens in de scope opslaat, roep dan je oprol-functie aan
* omhoogtellen: maak een plaatje waarin de cijfers van 0-9 onder elkaar staan: "cijferbalk". Onder die 9 moet weer een 0 volgen voor een vloeiende overgang. Maak een functie/object dat 1 cijfer kan weergeven, in een divje, cijferbalk in de achtergrond, overflow=hidden, positie zodat het gewenste cijfer in beeld is
En hoe kan ik dan de php-waarde $bedragTotaal in het script krijgen? Ik neem aan dat ik niet gewoon een php-var aan kan roepen midden in javascript?
Zie jij toevallig waarom het script zoals ik hierboven heb geplaatst niet werkt? Het werkt op de demo pagina namelijk prima. Maar in mijn live-omgeving niet.
@Bas:
Ik heb jouw ticker even geprobeerd en wellicht kan het op die manier ook. Ik heb wel de waarde -15*setval gewijzigd in -16*setval omdat 1em = 16px en niet 15px. Nu loopt hij mooier.
Dit script heeft echter wel een groot nadeel, namelijk dat je alle getallen die je ooit zult willen weergeven moet noteren. Aangezien mijn teller toch ergens in de 100.000 terecht gaat komen is dit dus geen optie. Hoe kan ik dit oplossen?
Maar stel nou dat ik het toch liever niet met die omhoogrolfunctie doe maar gewoon wil tellen (dus de nummers overschrijven elkaar en schuiven niet weg naar boven). Kan ik dat op deze manier dan doen:
<?php
function checkBedragTotaal()
{
$sql = "SELECT SUM(bedrag) AS bedragTotaal FROM table";
$res = mysql_query($sql);
while($row = mysql_fetch_array($res)) {
return $row['bedragTotaal'];
}
}
//
$startValue = checkBedragTotaal();
$endValue = $startValue;
?>
<!-- Geef de counter weer -->
<div id="counter">
</div>
<script type="text/javascript">
// Controleer iedere 10 seconden of bedragTotaal is gewijzigd.
// Als het bedragTotaalOud != bedragTotaal -> counter starten en optellen naar bedragTotaal.
// Als bedragTotaal is bereikt, counter stoppen.
// Weer opnieuw beginnen met om de 10 seconden te controleren of bedragTotaal is gewijzigd.
</script>
Nee, je kunt vanuit javascript niet meer bij PHP. De pagina wordt op de server behandeld, alle PHP wordt geinterpreteerd, en dan gaat het resultaat over het net naar de browser. De browser voert eventueel javascript uit.
Je moet dus vanuit javascript een request naar de server versturen: Geef me dat totaal nog es!
Heb jij jquery wel aan boord? Dan kun je zoiets doen als (html, waarschuwing: "air code", bedacht maar niet geprobeerd)
@Bas:
Je bent een held! Ik heb het inmiddels zover gekregen dat het script inderdaad iedere 5 of 10 seconden de SUM van bedrag uit de database haalt! Helemaal geweldig.
EDIT De interval werkt overigens niet.
De interval werkt als je 'window.' ervoor weghaalt. Dan update het script om de 10 sec.
END EDIT
Nu moet ik alleen nog even gaan sleutelen om ervoor te zorgen dat wanneer er een nieuw (hoger) bedragTotaal is dan het vorige bedragTotaal dat het script dan niet simpelweg het nieuwe bedragTotaal laat zien, maar gaat optellen vanaf het oude bedragTotaal naar het nieuwe bedragTotaal.
Ik ga nu eerst even een hapje eten en dan maar hopen dat ik van de vrouw nog achter de pc mag (lol). Ik kom er vanavond of anders morgen op terug.
Kijk of dit bij jou telt. Zo nee, dan is er iets raars :) en zo ja, zoek de verschillen met jouw code.
Ja, dit werkt bij mij.
Maar de bedoeling is niet dat er lukraak wordt geteld zodra er een bezoeker op de pagina komt. De bedoeling is als volgt:
// Bezoeker landt op pagina -> toon huidig bedragTotaal.
// Controleer vervolgens iedere 10 seconden of bedragTotaal is gewijzigd (ingelogde bezoekers kunnen achter de schermen namelijk een bedrag hebben toegevoegd aan de database waardoor het bedragTotaal hoger is geworden).
// Als het bedragTotaalOud != bedragTotaal -> teller starten en optellen naar het nieuwe bedragTotaal.
// Als bedragTotaal is bereikt, teller stoppen.
// Vervolgens pas weer na 10 seconden controleren of bedragTotaal is gewijzigd.
// Begin opnieuw. Enzovoort, enzovoort... (loop)
Ik heb hier een ticker die werkt:
<script language="javascript" type="text/javascript">
<!--
// http://www.dailycoding.com/Posts/object_oriented_programming_with_javascript__timer_class.aspx
// Declaring class "Timer"
var Timer = function()
{
// Property: Frequency of elapse event of the timer in millisecond
this.Interval = 1000;
// Property: Whether the timer is enable or not
this.Enable = new Boolean(false);
// Event: Timer tick
this.Tick;
// Member variable: Hold interval id of the timer
var timerId = 0;
// Member variable: Hold instance of this class
var thisObject;
// Function: Start the timer
this.Start = function()
{
this.Enable = new Boolean(true);
thisObject = this;
if (thisObject.Enable)
{
thisObject.timerId = setInterval(
function()
{
thisObject.Tick();
}, thisObject.Interval);
}
};
// Function: Stops the timer
this.Stop = function()
{
thisObject.Enable = new Boolean(false);
clearInterval(thisObject.timerId);
};
};
var startValue = 30; // This is the value the counter will start with
var endValue = 200; // This is the value at which the counter will end counting
var obj = new Timer();
obj.Interval = 30;
obj.Tick = timer_tick;
obj.Start();
function timer_tick()
{
startValue = startValue + 1;
document.getElementById("div1").innerHTML = startValue;
if (startValue == endValue)
{
obj.Stop();
}
}
//-->
</script>
Weet alleen nog niet hoe ik nu die start en eindwaarde vanuit de database in deze ticker kan stoppen.