Visszaszámláló script

egyéb dolgok, amik már nem férnek bele másik kategóriába

Visszaszámláló script

HozzászólásSzerző: Afronaut » 2011.08.30. 11:39

Helló Mindenki!
A következő lenne a kérdésem/kérésem:
Adott a következő script:
Kód: Egész kijelölése
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style style="text/css">

.lcdstyle{ /*Example CSS to create LCD countdown look*/
color:#fff;
font: bold 14px MS Sans Serif;
padding: 3px;
   margin-top: 20px;
   margin-right: 0px;
   margin-bottom: 400px;
   margin-left: 0px;
}

.lcdstyle sup{ /*Example CSS to create LCD countdown look*/
font-size: 80%
}

</style>

<script type="text/javascript">

/***********************************************
* Universal Countdown script- © Dynamic Drive (http://www.dynamicdrive.com)
* This notice MUST stay intact for legal use
* Visit http://www.dynamicdrive.com/ for this script and 100s more.
***********************************************/

function cdLocalTime(container, servermode, offsetMinutes, targetdate, debugmode){
if (!document.getElementById || !document.getElementById(container)) return
this.container=document.getElementById(container)
var servertimestring=(servermode=="server-php")? '<? print date("F d, Y H:i:s", time())?>' : (servermode=="server-ssi")? '<!--#config timefmt="%B %d, %Y %H:%M:%S"--><!--#echo var="DATE_LOCAL" -->' : '<%= Now() %>'
this.localtime=this.serverdate=new Date(servertimestring)
this.targetdate=new Date(targetdate)
this.debugmode=(typeof debugmode!="undefined")? 1 : 0
this.timesup=false
this.localtime.setTime(this.serverdate.getTime()+offsetMinutes*60*1000) //add user offset to server time
this.updateTime()
}

cdLocalTime.prototype.updateTime=function(){
var thisobj=this
this.localtime.setSeconds(this.localtime.getSeconds()+1)
setTimeout(function(){thisobj.updateTime()}, 1000) //update time every second
}

cdLocalTime.prototype.displaycountdown=function(baseunit, functionref){
this.baseunit=baseunit
this.formatresults=functionref
this.showresults()
}

cdLocalTime.prototype.showresults=function(){
var thisobj=this
var debugstring=(this.debugmode)? "<p style=\"background-color: #FCD6D6; color: black; padding: 5px\"><big>Debug Mode on!</big><br /><b>Current Local time:</b> "+this.localtime.toLocaleString()+"<br />Verify this is the correct current local time, in other words, time zone of count down date.<br /><br /><b>Target Time:</b> "+this.targetdate.toLocaleString()+"<br />Verify this is the date/time you wish to count down to (should be a future date).</p>" : ""

var timediff=(this.targetdate-this.localtime)/1000 //difference btw target date and current date, in seconds
if (timediff<0){ //if time is up
this.targetdate.setHours(this.targetdate.getHours()+12)
}
var oneMinute=60 //minute unit in seconds
var oneHour=60*60 //hour unit in seconds
var oneDay=60*60*24 //day unit in seconds
var dayfield=Math.floor(timediff/oneDay)
var hourfield=Math.floor((timediff-dayfield*oneDay)/oneHour)
var minutefield=Math.floor((timediff-dayfield*oneDay-hourfield*oneHour)/oneMinute)
var secondfield=Math.floor((timediff-dayfield*oneDay-hourfield*oneHour-minutefield*oneMinute))
if (this.baseunit=="hours"){ //if base unit is hours, set "hourfield" to be topmost level
hourfield=dayfield*24+hourfield
dayfield="n/a"
}
else if (this.baseunit=="minutes"){ //if base unit is minutes, set "minutefield" to be topmost level
minutefield=dayfield*24*60+hourfield*60+minutefield
dayfield=hourfield="n/a"
}
else if (this.baseunit=="seconds"){ //if base unit is seconds, set "secondfield" to be topmost level
var secondfield=timediff
dayfield=hourfield=minutefield="n/a"
}
this.container.innerHTML=debugstring+this.formatresults(dayfield, hourfield, minutefield, secondfield)
setTimeout(function(){thisobj.showresults()}, 1000) //update results every second
}

/////CUSTOM FORMAT OUTPUT FUNCTIONS BELOW//////////////////////////////

//Create your own custom format function to pass into cdLocalTime.displaycountdown()
//Use arguments[0] to access "Days" left
//Use arguments[1] to access "Hours" left
//Use arguments[2] to access "Minutes" left
//Use arguments[3] to access "Seconds" left

//The values of these arguments may change depending on the "baseunit" parameter of cdLocalTime.displaycountdown()
//For example, if "baseunit" is set to "hours", arguments[0] becomes meaningless and contains "n/a"
//For example, if "baseunit" is set to "minutes", arguments[0] and arguments[1] become meaningless etc

//1) Display countdown using plain text
function formatresults(){
if (this.timesup==false){//if target date/time not yet met
var displaystring="<span class='lcdstyle'>Next Nation War in:"+arguments[1]+" H "+arguments[2]+" M "+arguments[3]+" S</span>"
}
else{ //else if target date/time met
var displaystring="Launch time!"
}
return displaystring
}

//2) Display countdown with a stylish LCD look, and display an alert on target date/time
function formatresults2(){
if (this.timesup==false){ //if target date/time not yet met
var displaystring="<span class='lcdstyle'>Next Nation War in"+arguments[1]+" <sup>H</sup> "+arguments[2]+" <sup>M</sup> "+arguments[3]+" <sup>S</sup></span>"
}
else{ //else if target date/time met
var displaystring="" //Don't display any text
alert("Launch time!") //Instead, perform a custom alert
}
return displaystring
}

</script>
</head>
<body>
<div id="cdcontainer"></div>
<script type="text/javascript">
var servermode='server-php' //Set to server mode
var targettime='20:00:00' //Set to target time leave seconds as 00
var container='cdcontainer' //Set to name of container
var offsetMinutes=0 //Set to LocaltimeoffsetMinutes
/////////////////// Stop Editing ///////////////////
var servertimestring=(servermode=="server-php")? '<? print date("F d, Y H:i:s", time())?>' : (servermode=="server-ssi")? '<!--#config timefmt="%B %d, %Y %H:%M:%S"--><!--#echo var="DATE_LOCAL" -->' : '<%= Now() %>'
var prep=new Date(servertimestring); prep.months=['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
prep.limit=targettime.split(':');
for (var i_tem = 0; i_tem < prep.limit.length; i_tem++)
prep.limit[i_tem]=parseInt(prep.limit[i_tem], 10);
if(prep.getHours()>prep.limit[0]||(prep.getHours()==prep.limit[0]&&prep.getMinutes()>=prep.limit[1]))
prep.limit[0]+=12;
if(prep.getHours()>prep.limit[0]||(prep.getHours()==prep.limit[0]&&prep.getMinutes()>=prep.limit[1])){
prep.limit[0]-=12;
prep.setDate(prep.getDate()+1);
}
prep.base=prep.months[prep.getMonth()]+' '+prep.getDate()+', '+prep.getFullYear()+' '+prep.limit[0]+':'+prep.limit[1]+':00';
var launchdate=new cdLocalTime(container, servermode, offsetMinutes, prep.base);
launchdate.displaycountdown("hours", formatresults);
</script>

</body>
</html>

Ez jelenleg a "var targettime='20:00:00' //Set to target time leave seconds as 00" szerint beállított időre számol vissza illetve 12 óránként (Szerver idő szerint).
Nos nem nagyon értek az e fajta scriptekhez és azt szeretném, hogy a beállított időtől (Például: 00:00:00) minden 2 órába számoljon vissza.
Próbáltam módosítani de valószínűleg kihagyhattam valamit mert 2x vagy 3x 2 órát számolt vissza utána pedig újra az eredeti időpontra számolt vissza.
Szóval a kérdés/kérés az lenne, hogy tudna-e valaki ebben segíteni átírni, hogy 2 óránként számoljon vissza az adott időre?

Előre is köszönöm.

U.I.: Valaki 1 ingyenes működő smtp szervert (localhostra) tudna ajánlani?
Afronaut
 
Hozzászólások: 33
Csatlakozott: 2010.04.30. 23:52

Re: Visszaszámláló script

HozzászólásSzerző: l2sh » 2011.08.30. 20:30

Hali!

Egyszerű. Írtam gyorsban egyet neked. :)
Kód: Egész kijelölése
window.onload = init;

var ettol;
var idozito;
var ido;

var xmlhttp = {

    Obj : null,

    init : function(){
        if(this.Obj != null)
            return;
        if(window.XMLHttpRequest){
            this.Obj = new XMLHttpRequest();
        }else{
            this.Obj = new ActiveXObject("Microsoft.XMLHTTP");
        }
    },

    post : function(func, url, param){
        this.init();
        var xmlhttpObj = this.Obj;
        xmlhttpObj.onreadystatechange = function(){
            if(this.readyState == 4
                && this.status == 200){
                var data = eval("("+this.responseText+")");
                func(data);
            }
        }
        xmlhttpObj.open("POST", url, true);
        xmlhttpObj.send(param);
    }

};

function init(){
    xmlhttp.post(function(data){
        ettol = data.ettol;
        ido = data.ido;
        startIdozito();
    }, "idolekero.php", null);
}

function startIdozito(){
    stop();
    start();
}

function szamFormatum(num){
    return (num < 10) ? "0"+num : num;
}

function reset(){
    ido = ettol;
}

function start(){
    szamol();
    if(idozito == 0){
        idozito = setInterval(szamol, 1000);
    }
}

function stop(){
    clearInterval(idozito);
    idozito = 0;
}

function szamol(){
    var ora = Math.floor(ido/3600);
    var perc = Math.floor(ido/60)%60;
    var masodperc = ido%60;
    document.getElementById("idozitoDiv").innerHTML = szamFormatum(ora)
    +":"+szamFormatum(perc)
    +":"+szamFormatum(masodperc);
    if(ido < 1){
        reset();
        return;
    }
    ido--;
}


Kód: Egész kijelölése
<?php
$msg 
= array(
    'ettol' => 2*60*60, // 2 óra
    'ido' => 85*60 // például, ha 1 óra 25 percnél
                   // tart az aktuális visszaszámlálás
    ); 
header
('Content-type: application/json');
echo json_encode($msg); 


Ez minden oldal újratöltéskor postol az idolekero.php-nak, ami visszaadja az aktuális óra számát. Gondolom szerveroldalon akarod ezt lekezelni, mármint a visszaszámlálás kezdetét akár egységesen minden felhasználónak, akár külön-külön. De ezt majd te megírod a php scriptben, mert én nem tudom, mire akarod használni. :)

Egyébként a javascript része szebbb lenne egy jQuery-vel, de most én pont azt akartam szemléltetni, hogy működik ott is. De jQuery-vel mindenképp biztonságosabb már a $(document).ready() miatt is. Ajánlom a használatát. :)

Természetesen ne a javascriptre bízd a visszaszámlálás ellenőrzését, mert akárki akármit beírhat, és akkor fogod azt mondani, hogy hülye csalók. :D PHP-vel ellenőrizz mindent, és lehetőleg minden GET vagy POST request headert ellenőrizz. Nehogy a végén feltörjék a weboldaladat. :)
l2sh
 
Hozzászólások: 95
Csatlakozott: 2009.03.22. 13:01

Re: Visszaszámláló script

HozzászólásSzerző: Afronaut » 2011.08.31. 14:14

l2sh írta:Hali!

Egyszerű. Írtam gyorsban egyet neked. :)
Kód: Egész kijelölése
window.onload = init;

var ettol;
var idozito;
var ido;

var xmlhttp = {

    Obj : null,

    init : function(){
        if(this.Obj != null)
            return;
        if(window.XMLHttpRequest){
            this.Obj = new XMLHttpRequest();
        }else{
            this.Obj = new ActiveXObject("Microsoft.XMLHTTP");
        }
    },

    post : function(func, url, param){
        this.init();
        var xmlhttpObj = this.Obj;
        xmlhttpObj.onreadystatechange = function(){
            if(this.readyState == 4
                && this.status == 200){
                var data = eval("("+this.responseText+")");
                func(data);
            }
        }
        xmlhttpObj.open("POST", url, true);
        xmlhttpObj.send(param);
    }

};

function init(){
    xmlhttp.post(function(data){
        ettol = data.ettol;
        ido = data.ido;
        startIdozito();
    }, "idolekero.php", null);
}

function startIdozito(){
    stop();
    start();
}

function szamFormatum(num){
    return (num < 10) ? "0"+num : num;
}

function reset(){
    ido = ettol;
}

function start(){
    szamol();
    if(idozito == 0){
        idozito = setInterval(szamol, 1000);
    }
}

function stop(){
    clearInterval(idozito);
    idozito = 0;
}

function szamol(){
    var ora = Math.floor(ido/3600);
    var perc = Math.floor(ido/60)%60;
    var masodperc = ido%60;
    document.getElementById("idozitoDiv").innerHTML = szamFormatum(ora)
    +":"+szamFormatum(perc)
    +":"+szamFormatum(masodperc);
    if(ido < 1){
        reset();
        return;
    }
    ido--;
}


Kód: Egész kijelölése
<?php
$msg 
= array(
    'ettol' => 2*60*60, // 2 óra
    'ido' => 85*60 // például, ha 1 óra 25 percnél
                   // tart az aktuális visszaszámlálás
    ); 
header
('Content-type: application/json');
echo json_encode($msg); 


Ez minden oldal újratöltéskor postol az idolekero.php-nak, ami visszaadja az aktuális óra számát. Gondolom szerveroldalon akarod ezt lekezelni, mármint a visszaszámlálás kezdetét akár egységesen minden felhasználónak, akár külön-külön. De ezt majd te megírod a php scriptben, mert én nem tudom, mire akarod használni. :)

Egyébként a javascript része szebbb lenne egy jQuery-vel, de most én pont azt akartam szemléltetni, hogy működik ott is. De jQuery-vel mindenképp biztonságosabb már a $(document).ready() miatt is. Ajánlom a használatát. :)

Természetesen ne a javascriptre bízd a visszaszámlálás ellenőrzését, mert akárki akármit beírhat, és akkor fogod azt mondani, hogy hülye csalók. :D PHP-vel ellenőrizz mindent, és lehetőleg minden GET vagy POST request headert ellenőrizz. Nehogy a végén feltörjék a weboldaladat. :)

Köszönöm szépen át tanulmányozom kicsit.
Amúgy a script mmm igazából semmi komolyhoz nem kapcsolódna csak annyi, hogy adott 1 játék amiben van 1 bizonyos event.
Az event minden 2 órában van (szerver idő szerint 00:00:00-tól kezdve) viszont a script nem kapcsolódik a játékhoz semmilyen formában csak kijelzi hogy mennyi van vissza az indulásig és amikor lejárt akkor újraindul a számláló.
Köszi még 1x.
Afronaut
 
Hozzászólások: 33
Csatlakozott: 2010.04.30. 23:52

Re: Visszaszámláló script

HozzászólásSzerző: l2sh » 2011.08.31. 17:00

Afronaut írta:Köszönöm szépen át tanulmányozom kicsit.
Amúgy a script mmm igazából semmi komolyhoz nem kapcsolódna csak annyi, hogy adott 1 játék amiben van 1 bizonyos event.
Az event minden 2 órában van (szerver idő szerint 00:00:00-tól kezdve) viszont a script nem kapcsolódik a játékhoz semmilyen formában csak kijelzi hogy mennyi van vissza az indulásig és amikor lejárt akkor újraindul a számláló.
Köszi még 1x.


Nincs mit. :)
De mégis kapcsolódik hozzá, hisz a játékban levő eventre való visszaszámlálást jelzi ki. Csak az oldal betöltésénél kell a kettő között kapcsolatnak lennie, vagyis amikor lekéri php-ból az eventig hátralevő időt. Röviden, mivel a játék php-ben van, így csak onnan tudod lekérni. Még ha a felhasználó vár is annyi időt, az időzítő resetnél nem kell php-ból lekérnie, hisz az nem dinamikusan változó érték. Mindig 2 óránként számol vissza.
l2sh
 
Hozzászólások: 95
Csatlakozott: 2009.03.22. 13:01

Re: Visszaszámláló script

HozzászólásSzerző: Afronaut » 2011.08.31. 18:56

l2sh írta:
Afronaut írta:Köszönöm szépen át tanulmányozom kicsit.
Amúgy a script mmm igazából semmi komolyhoz nem kapcsolódna csak annyi, hogy adott 1 játék amiben van 1 bizonyos event.
Az event minden 2 órában van (szerver idő szerint 00:00:00-tól kezdve) viszont a script nem kapcsolódik a játékhoz semmilyen formában csak kijelzi hogy mennyi van vissza az indulásig és amikor lejárt akkor újraindul a számláló.
Köszi még 1x.


Nincs mit. :)
De mégis kapcsolódik hozzá, hisz a játékban levő eventre való visszaszámlálást jelzi ki. Csak az oldal betöltésénél kell a kettő között kapcsolatnak lennie, vagyis amikor lekéri php-ból az eventig hátralevő időt. Röviden, mivel a játék php-ben van, így csak onnan tudod lekérni. Még ha a felhasználó vár is annyi időt, az időzítő resetnél nem kell php-ból lekérnie, hisz az nem dinamikusan változó érték. Mindig 2 óránként számol vissza.


Értem.
Amúgy a játék nem php alapú sőt nem is 1ugyanaz szerverről fut a webbel viszont ugyanaz a szerveridő a 2 szerveren xD vagyis érted na :P
Szal a php nem a játékból kéri le a hátralévő időt hanem csak 1 előre beállított intervallumot számol mindig vissza. Nem tudom érted-e mire gondolok de valahogy így van megoldva. (ill. így kellene megoldanom :P)
Afronaut
 
Hozzászólások: 33
Csatlakozott: 2010.04.30. 23:52

Re: Visszaszámláló script

HozzászólásSzerző: l2sh » 2011.08.31. 21:23

Afronaut írta:Értem.
Amúgy a játék nem php alapú sőt nem is 1ugyanaz szerverről fut a webbel viszont ugyanaz a szerveridő a 2 szerveren xD vagyis érted na :P
Szal a php nem a játékból kéri le a hátralévő időt hanem csak 1 előre beállított intervallumot számol mindig vissza. Nem tudom érted-e mire gondolok de valahogy így van megoldva. (ill. így kellene megoldanom :P)


Ja, hogy te egy külön játékszerverről beszélsz. Javascriptben az a baj, hogy csak így lehet megoldani, vagyis webszerver oldali scripten keresztül kell valamit csinálni.

Két megoldást tudok:

1. Ha gondolod, kiszámolhatod javascriptben is úgy, hogy (2 * 60 * 60) - ((aktuális timestamp - éjféli timestamp) % (2 * 60 * 60)), és a maradék lesz az amitől visszaszámol. Ha ez 0, akkor 2 órától számol vissza.
Példa:
Aktuális timestamp 1314823289 (22 óra 41 perc 29 másodperc), éjféli timestamp 1314741600.
Tehát (2 * 60 * 60) - ((1314823289 - 1314741600) % (2 * 60 * 60)) = 4711.
Ez másodpercekben van megadva, tehát ebből kiszámolva - minden lefelé kerekítve - az óra 4711/3600 = 1, a perc 4711/60%60 = 18, másodperc 4711%60 = 31.
Azaz 1 óra 18 perc 31 másodperctől számol vissza 22 óra 41 perc 29 másodperces időpontnál.

Az előzőleg látott javascriptben az init függvényt cseréld ki az alábbira, valamint az "ettol" változó értékének add meg ezt: 2*60*60*1000
Az 1000-es a végén fontos, mivel a getTime() milliszekundumokban adja a timestampet, és azzal kell számolnunk!
Kód: Egész kijelölése
function init(){
    var d1 = new Date();
    var most = d1.getTime();
    var d2 = new Date(most);
    d2.setHours(0, 0, 0, 0);
    var ejfel = d2.getTime();
    ido = ettol - ( (most - ejfel) % ettol );
    ido = Math.floor(ido / 1000);
    ettol = ettol / 1000;

    // milliszekundumos csúszás korrigálása, de sajnos a futásidők különböznek,
    // és nem lesz tökéletes szinkronban, akár 1 másodpercet is tévedhet
    setTimeout(startIdozito, ido % 1000);
}


2. Ha van telnet lehetőség a játékszerveren, akkor azon keresztül tudsz parancskérelmeket küldeni, amit a szerver visszaküld a scriptnek, vagy esetleg más nyitott socket listenert létrehozol a szerveren egy másik threaden (szálon), ami várja a bejövő kapcsolatokat, de ez erőforrásigényes, mármint nem a kapcsolatra várakozás, hanem a későbbiekben a küldés-fogadás, ami két élő threadet foglal el az alapthreaddel együtt.

Az egyszerűség kedvéért én a sima javascriptes megoldást javaslom, viszont akkor ha módosítod az event időpontját, a scriptet is módosítanod kell, ami nem minden böngésző esetében töltődik le újból, de van rá egy trükk. Például:

Kód: Egész kijelölése
<script type="text/javascript" src="main.js?20110831_2321"></script>


Ez attól a main.js fájlt fogja meghívni, viszont a böngésző a src értékét raktározza, és ha újat talál, akkor azt is letölti, ezért van ott jelen esetben az aktuális időpont a végén paraméternek, de lehet akármilyen szöveg utána, a lényeg, hogy ha nincs tárolva a böngésző által, akkor letölti, és nem a gyorsítótárból szedi elő.
l2sh
 
Hozzászólások: 95
Csatlakozott: 2009.03.22. 13:01

Re: Visszaszámláló script

HozzászólásSzerző: Afronaut » 2011.09.07. 09:51

Köszönöm szépen eljátszok majd akkor ezekkel :)
Afronaut
 
Hozzászólások: 33
Csatlakozott: 2010.04.30. 23:52


Vissza: Segédletek, Tippek, Egyebek

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég

cron