ugrás a tartalomhoz

Javascript érték növelés bizonyos időközönként

majsko · 2013. Dec. 2. (H), 10.40
Sziasztok!

Hát az előre leszögezném, hogy JS-ből tök kuka vagyok :)
Az lenne a kérdés, hogy valaki tud-e olyan kész és jól működő js kódot, ami bizonyos időközönként növel 1 változót. Valami ilyesmire gondolok a gyakorlatban:
Ha van egy i változóm aminek a kezdő értéke 100 és tudom hogy 0,23-al kell növelnem másodpercenként akkor percenként növeli 14-el az i-t (0,23*60= 13,8 azaz kerekíti is de a maradékot nem felejti el hanem azzal kezdi a következő percet, jelen esetben mínusz 0,2-vel). A kezdő értéket és a növelés értékét PHP-ból kapja. És persze nem kell megemlítenem, hogy mindezt oldal töltés nélkül kellene művelje (pl.: cooldown ott is csak megy lefele az idő és nem tölt újra.)

Nagyon nagy segítség lenne ha valaki tudna ilyet! Nagyon köszönöm!
 
1

Igen, mindenki tud

zzrek · 2013. Dec. 2. (H), 11.48
Igen, szerintem itt mindenki tud ilyen kódot csinálni.
Az lenne a kérdés, hogy valaki tud-e olyan kész és jól működő js kódot

...
JS-ből tök kuka vagyok

És akarsz ezen változtatni?
Ha nem, akkor a feladatot a "munka és állás" rovatban kéne meghirdetned.

Ha igen, akkor ennek örülök és szívesen segítek.
Meddig jutottál? Mivel próbálkoztál?
A PHP rész megvan, csak a JS-sel van gond?
3

Szia!Köszönöm, hogy

majsko · 2013. Dec. 2. (H), 12.44
Szia!

Köszönöm, hogy segítesz :)

Meddig jutottál? Mivel próbálkoztál?

<?php
$novelendo = 2;
$mennyivel = 10;
?>

<script>
    var novelendo = <?php echo $novelendo; ?>;
    var mennyivel = <?php echo $mennyivel; ?>;
    
    setInterval(function(){myadder()},1000);
    
    function myadder()
      {
        c = parseInt(novelendo, 10) + parseInt(mennyivel, 10);
        alert(c);
      }
</script>
A próba kedvéért átneveztem a változókat :D
Hna most ezzel az a gond, hogy össze is adja meg ki is dobja alert-be, de mindig ugyanazt, azaz nem az előző összegéhez hozzáadott új összeget.

A PHP rész megvan

Igen megvan PHP-vel nincs gond :)
4

Megjegyzések és példa

Endyl · 2013. Dec. 2. (H), 13.22
Megjegyzések a példával kapcsolatban:
  • myadder()-ben nem deklarálod (var kulcsszó hiánya) a c változót, így globális változóval fog operálni, amit nem biztos, hogy szeretnél
  • nem tárolod el a növelt értéket sehol -illetve globális c változóban igen (de mint fentebb írtam, nem jó gyakorlat), viszont mindig felülírod ugyanazzal-, csak használod a novelendo és mennyivel változókat (így még szép, hogy mindig ugyanazt látod)
  • parseInt()-et használsz (ami csonkol, nem kerekít), holott van csodás kerekítő függvény is (Math.round())
  • összeadás előtt "kerekíted" az értékeket, ami a témanyitóban említett 0,23-dal problémás lenne
  • nem korrigálod a setInterval() esetleges pontatlanságát, ami hosszú futásidő esetén egyre észrevehetőbb lesz
  • az egész kódod a globális névteret szennyezi, ami növekvő projektméret esetén később problémát okozhat


Megírtam egy kis példakódot kicsit más "nevezéktannal", de érthetőnek kell lennie:

(function myIntervalIncrement() {
    var myValue = 100, // TODO: alapérték, PHP-ból
        myIncrement = 0.23, // TODO: másodpercenkénti növekmény, PHP-ból
		updateFrequency = 1000, // frissítés igényelt gyakorisága, ms
		lastUpdate, // legutóbbi frissítés ideje, kompenzálandó a setInterval() pontatlanságát, nagyobb pontosságért jöhet PHP-ból; epoch óta eltelt ms, UTC
		myInterval; // intervalID, ha szeretnénk valamikor leállítani a számolást
	
	/**
	 * Eltelt idő alapján frissíti myValue értékét
	 */
	function incrementValue() {
		// modern böngészőkben használható a Date.now()
		var now = (new Date()).getTime(),
			elapsedTime = now - lastUpdate;
		
		lastUpdate = now; // kiszámoltuk az eltelt időt, eltárolhatjuk a jelenlegi időt, mint legutóbbi frissítés
		
		myValue += myIncrement * (elapsedTime / 1000);
	}
	
    /**
     * myValue igény szerinti megjelenítése
     */
	function displayCurrentValue() {
		var displayValue = Math.round(myValue);
		// TODO: érték igény szerinti kijelzése;
        
        // példa: konzolba iratás
		console.log(displayValue, myValue);
        
        // példa: dokumentumban kijelzés
        document.getElementById('roundedValue').textContent = displayValue;
        document.getElementById('actualValue').textContent = myValue;
	}
	
    /**
     * Az időközönként végrehajtandó utasítások összefoglalása
     */
	function intervalCallback() {
		incrementValue();
		displayCurrentValue();
	}
	
	lastUpdate = (new Date()).getTime(); // ha nem PHP-ból jön a legutóbbi frissítés ideje, akkor tároljuk el most; modern böngészőkben Date.now()
	myInterval = setInterval(intervalCallback, updateFrequency);
})();
Példa html részlet:

<pre>
Kerekített: <span id="roundedValue">n/a</span>
Tényleges:  <span id="actualValue">n/a</span>
</pre>
Kipróbálható a jsfiddle.net-en.
5

Köszönöm

majsko · 2013. Dec. 2. (H), 15.34
Köszönöm szépen ez nagyon hasznos!! Ebből tanulni is tudok meg fel is tudom használni! Nagyon örülök, köszönöm még egyszer. Még annyi kérdésem viszont lenne, ha nem vagyok nagyon pofátlan, hogy ezt, hogyan tudom átdobni egy php változóba:
// példa: dokumentumban kijelzés
document.getElementById('roundedValue').textContent = displayValue;
document.getElementById('actualValue').textContent = myValue;


Mert igazából az lenne a funkciója, hogyha újratöltődik az oldal vagy frissül vagy hasonló akkor az aktuális értéket adatbázisba el akarom tárolni, azaz mindig folytatódna a számolás.

Köszönöm az eddigieket nagyon!
6

Szükséges szerver oldalon az

Endyl · 2013. Dec. 2. (H), 16.38
Szükséges szerver oldalon az aktuális értéket tárolni? Szerintem egyszerűbb -és pontosabb-, ha eltárolod az indulási időt (valamint az alapértéket és a növelés mértékét), és abból mindig ki tudod számolni az éppen aktuálisat.

A kódban, amit írtam, pedig simán kiveszed a 44. sort, és akkor kezdésnek myValue értéke az alapérték, az 5. sorban pedig lastUpdate értékét -ahogy írtam- beállítod PHP-ból az indulási időre UTC milliszekundumokban.

Tehát a kezdő értékadás ilyesmi lesz (tegyük fel, hogy $startTime-ban található az indulási idő, UTC-ben, DateTime objektumként):

(function myIntervalIncrement() {
    var myValue = <?php echo $starterValue; ?>, // TODO: alapérték, PHP-ból
        myIncrement = <?php echo $myIncrement; ?>, // TODO: másodpercenkénti növekmény, PHP-ból
        updateFrequency = 1000, // frissítés igényelt gyakorisága, ms
        lastUpdate = <?php echo $startTime->getTimestamp() * 1000; ?>, // legutóbbi frissítés ideje, kompenzálandó a setInterval() pontatlanságát, nagyobb pontosságért jöhet PHP-ból; epoch óta eltelt ms, UTC
        myInterval; // intervalID, ha szeretnénk valamikor leállítani a számolást
// stb.
7

Elérhetőség

majsko · 2013. Dec. 2. (H), 18.36
Szia!

Ha nem probléma kérhetnék egy elérhetőséget (skype, face, stb..), mert lenne még 1-2 kérdésem, és meg szeretném érteni teljesen ezt a dolgot.

Köszönöm
8

Weblabor :)

Endyl · 2013. Dec. 2. (H), 21.12
Hát, ha még kérdésed van, itt ez a remek fórum (akár ez a téma, akár új) :) Az itt megválaszolt kérdéseket később vissza lehet keresni, mások is tanulhatnak belőle, és nem idézzük elő az internetes válaszkeresés egy klasszikus esetét.
9

Rendben

majsko · 2013. Dec. 2. (H), 22.16
Rendben köszönöm! :)
Akkor kezdeném is :) Változtattam ezt-azt a programon, pl hogy meddig számolhat el maximum és utána mit tegyen ha elérte stb.. de még egy olyan kérdésem lehetnem, hogy azt lehet figyelni js-el hogy ha újra akar töltődni az oldal akkor felölti a jelen állás db-be? Ha igen akkor az hogy lenne? A másik az lenne hogyha egyszerre több ilyen számolás is lenne egyszerre különböző adatokkal (azaz indulási- és növelési értékkel) az hogy valósulna meg?
Nagyon sokat segítesz remélem valahogy meg tudom majd hálálni :)

Köszönöm!
10

azt lehet figyelni js-el hogy

Poetro · 2013. Dec. 2. (H), 23.28
azt lehet figyelni js-el hogy ha újra akar töltődni az oldal akkor felölti a jelen állás db-be?

Nem, nem tudod figyelni, hogy újra akarna-e töltődni az oldal. Azt tudod nézni, hogy az illető el akar navigálni az oldalról, és ekkor egy figyelmeztetést dobhatsz föl neki, de mást nem tehetsz (onbeforeunload), azaz ekkor már késő adatbáziba menteni, hamarabb kell. Azaz amikor változást végzett a felhasználó, akkor küldesz egy kérést a PHP felé. De ez a kérés lehet, hogy csak hosszú másodpercek alatt ér el csak a szerverhez.
11

A másik az lenne hogyha

majsko · 2013. Dec. 3. (K), 19.47
A másik az lenne hogyha egyszerre több ilyen számolás is lenne egyszerre különböző adatokkal (azaz indulási- és növelési értékkel) az hogy valósulna meg?
12

Függvény

Endyl · 2013. Dec. 3. (K), 20.01
Becsomagolod egy függvénybe, aminek paraméterként átadod a vonatkozó adatokat, és kedved szerint indíthatod a számolókat. Ha a fentiek alapján ez nem megy, akkor érdemes lehet egy "kis" időt fektetni a JavaScript tanulásába.
2

Írd be egy keresőbe:

Karvaly84 · 2013. Dec. 2. (H), 11.57
Írd be egy keresőbe: XMLHttpRequest, setInterval, setTimeout, parseInt