-
@javaDeveloper2011
Leider besteht das Problem immernoch. Auch mit dem Code von Wollmaus.
Konnte nun das "Hängenbleiben" der Zeit eingrenzen. Es hängt des öfteren (nicht immer) wenn man die Maus still lässt und geht genau (mit falscher Zeit) weiter sobald man die Maus bewegt -> ähnlich wie ein Screensaver.
@wollmaus
Das wäre bei mir die Variable $differenz aus obigen PHP-code.Eingangs nehme die Clientzeit und rechne dazu die durch PHP gegebenen Sekunden der Dauer hinzu, Ergebnis ist die Clientzeit, an der der Countdown abgelaufen ist. Innerhalb der Funktion subtrahiere von dieser Endzeit die aktuelle Clientzeit, Ergebnis sind die noch verbleibenden Millisekunden des Countdowns.
PHP-Code:$differenz = $ZeitEndeAktion - $timestamp2;
Das Script wird immer aufgerufen solange die Aktion in der Datenbank steht, die Zeit nicht abgelaufen ist, der User irgendein Link der Navigation anklickt. Ist die Zeit um wird die Aktion in Tabelle Ereigniss gespeichert und die Aktion gelöscht.Egal wie unregelmässig die Funktion aufgerufen wird, es wird immer mit der echt vergangenen Zeit hantiert(ich nehme an, darum geht es dir).
Normal sieht der User also immer die Zeit und nur bei Klick würde das selbe Script (mit aktueller Zeit) wieder aufgerufen werden. Heist normal wird das Script nur einmal aufgerufen kann aber mehrmals aufgerufen werden.
Ohje ich hoffe ihr könnt mir folgen
Das eigentlich Problem ist das Hängenbleiben der Zeit. Es ist unrelevant für weitere Scripte oder weitere Berechnungen (Das Ereigniss läuft ab egal ob der User an der Zeit spielt). Das Problem ist eher das für den User lästige "die Zeit hängt man muss ich schon wieder aktualisieren", "Mist ich dachte die ganze Zeit ich bin unterwegs.. da hätte ich ja längst weitermachen können".
Eine wirklich unschöne Sache, ABER Gott sei dank kein Problem bei mir. Der User täte sich nur selbst verarschen. Wenn der User die Zeit verkürzt (durch Win-Uhr verstellen) läuft die Zeit ab-> Script timer.tpl wird immer abgefragt -> Aktion läuft noch -> Script unterwegs.tpl wird wieder aufgerufen.Beachte bei allem: nichts, was im Browser abläuft, ist vertrauenswürdig, User können alles manipulieren(z.B. einfach die PC-Uhr umstellen, wodurch sich die Clientzeit ändert).
Der Countdown würde also mit der richtigen Zeit weiterlaufen.
Nun wenn man also mit der WinUhr verstellen kann dann spielt hier durchaus irgendwo die WIN-API eine Rolle. Irgendwas lässt meinen Countdown immer mal stoppen. Alle Scripte inkl. meines Eingangspostes funktionierten aber hatten das "Hängen"-Problem. Sogar auf einen 2.en PC.
-
Wenn irgendetwas deinen Countdown stoppen lässt, und du sicher bist, daß du keine Skriptfehler irgendwo versteckt hast, dann musst du schlicht damit leben.
Dies mag dann eine Eigenheit deines OS oder Browsers sein, dass bei Inaktivität die Prozesspriorität herabgestuft wird oder dergleichen, im FF gibt es z.B. eine gesonderte Mindesteinstellung für Timeouts in inaktiven Tabs(allerdings ist dort der Standard 1000ms, daran kann es also nicht liegen, sofern du daran nicht herumgefummelt hast).
Kannst ja trotzdem mal nachgucken, der Name der Config wäre dom.min_background_timeout_value , der Wert sollte bei 1000 stehen.
-
Ja sieht wohl so aus

Der Wert ist übrigens auf 1000 wie zu erwarten.. hab da eh nie dran rumgefummelt.
Naja als ich deine neue Funktion heute implementiert hab dachte ich es nochmal gesehen zu haben. Jedenfalls ist es mir trotz versuche jetzt nicht nochmal aufgefallen. Ich nehm stark an das es irgendwas beim OS ist ein Prog im Hintergrund oder sonstwas. Gerade beim Schreiben dieses Textes fiel mir auf das beim Überlegen (was ich hier grad Schreibe) der Curser stehenblieb und verschwand.
Klingt komisch ist aber so. Ist das selbe wie oben beschrieben mit der Maus ähnlich einem Screensaver. Das hat definitiv was mit dem OS zu tun an den Browser glaub ich da garnicht mehr.
Ich denke mal dieses Prob kann man so nicht beheben also mit Script, bleibt nix übrig als das hinzunehmen .. wäre ja ohnehin in meinen Fall nur ein Userbility-Prob. Dennoch schon seltsam ..
Danke euch für die Hilfe
Geändert von Joe (09.11.11 um 23:47 Uhr)
-
Hey Leute,
ich glaub ich weiss was den Fehler hervorruft. Anscheinend hat das etwas mit dem Focus zu tun. Nach was weiss ich was wievielen Skeunden bis Minuten kann es passieren das FF den Focus verlässt und so scheinbar den Javascriptcode nicht mehr ausführt. Die Zeit bleibt stehen.
Mit dem Code von Wollmaus macht er bei einer Mausbewegung jedoch mit der richtigen Zeit weiter. Ich habe versucht nun ein OnBlur Event einzubauen das falls der Focus verloren geht er direckt wieder gesetzt wird. Besser wäre es den Focus halt immerwährend neu zu setzen.
Auch will ich jetzt keine blinkenden Cursor auf der Site sondern der Focus sollte irgendwo auf ein Element oder Bild weissen.
Tja also ich habe das mal so versucht da mir aber grundlegendes Wissen zu JS fehlt, wollte ich euch fragen ob das so geht wie ich dies hier gemacht habe oder das ganz und gar Quark ist.
HTML-Code:<p>Du bist noch <b><span id="countdown">0</span></b> min unterwegs.</p> <script type="text/javascript"> ( function(duration,node,action,delay) { var end = new Date(new Date().getTime()+(duration*1000)).getTime(), format = function(i) { return((i<10)?'0'+i:i); }, run = function() { var now=new Date().getTime(), diff=Math.floor((end-now)/1000), hh=Math.floor(diff/3600), mm=Math.floor((diff-(hh*3600))/60), ss=diff%60; node.innerHTML = top.document.title = [hh,format(mm),format(ss)].join(':'); if(diff<1) { action(); return; } setTimeout(run,delay); } run(); } )(<?php echo $differenz = $ZeitEndeAktion - $timestamp2;?>, //Laufzeit in Sekunden document.getElementById('countdown'), //Zielelement function(){location.href='main.php?section=erkunden';}, //finale Funktion 1000 //Intervall in Millisekunden ) function setFocus() { window.setTimeout("countdown.focus()", 0); } </script>
Vielen dank fürs lesen bzw helfen.HTML-Code:function setFocus() { window.setTimeout("countdown.focus()", 0); }
-
Ok das mit dem Focus geben scheint nicht wie gewollt zu klappen und wird verworfen unter Unsinn

Aber ich habe nach ewigen googeln endlich etwas gefunden mich wundert das dies fast im gesamten Netz niemanden auffällt wo doch die setTimeout Funktion sicher sehr oft genutzt wird.
Hier wird genau mein Problem angesprochen. Und ich bin richtig erleichtert das ich nicht der einzige bin der dieses Problem hat.
self-cancel,randomly, in Firefox - selbstabrechend, zufällig im Firefox.Well, I did this, and found that the loop would self-cancel, randomly, in Firefox. But how can this be? I haven’t called do_loop(true) manually, so is some kind of cancel argument getting passed into do_loop()? But how, and why? After all, I’d never consider passing additional arguments into a setTimeout callback, because IE doesn’t treat those arguments consistently. Well, it turns out, Firefox isn’t consistent either.
Tja also teste ich nun die seiner Meinung nach unschöne Lösung
So richtig vertsnaden, was nun das Problem ist, habe ich zwar nicht aber ich teste es mal aus und poste hier das Ergebniss.HTML-Code:setTimeout( function(){ do_loop(); }, delay );
Das Script nochmal als ganzes:
HTML-Code:<div id="content-pic"> <?php include 'templates/Ress.tpl'; ?> </div> <div id="upper-pic"> <h2>Pics:</h2> </div> <div id="uppercontent"> <h2>Text:</h2> </div> <div id=content> <h1>Erkundung</h1> <?php error_reporting(E_ALL); ini_set('display_errors', 1); $getAktionen = "SELECT Username, Aktion, ZeitEnde FROM Aktion WHERE Username='$Username' AND Aktion='Erkunden'"; $Aktionen = mysql_query($getAktionen); if (!$Aktionen) { die ('Etwas stimmte mit dem Query nicht: '.$db->error); } if (mysql_num_rows($Aktionen) != 0) { $rowAktionen = mysql_fetch_assoc($Aktionen); $ZeitEndeAktion=$rowAktionen["ZeitEnde"]; $timestamp2 = time(); } ?> <p>Du bist noch <b><span id="countdown">0</span></b> min unterwegs.</p> <script type="text/javascript"> ( function(duration,node,action,delay) <!-- Code by Wollmaus @ www.tutorials.de --> { var end = new Date(new Date().getTime()+(duration*1000)).getTime(), format = function(i) { return((i<10)?'0'+i:i); }, run = function() { var now=new Date().getTime(), diff=Math.floor((end-now)/1000), hh=Math.floor(diff/3600), mm=Math.floor((diff-(hh*3600))/60), ss=diff%60; node.innerHTML = top.document.title = [hh,format(mm),format(ss)].join(':'); if(diff<1) { action(); return; } //setTimeout(run,delay); setTimeout(function(){run();},delay); } run(); } ) (<?php echo $differenz = $ZeitEndeAktion - $timestamp2;?>, //Laufzeit in Sekunden document.getElementById('countdown'), //Zielelement function(){location.href='main.php?section=erkunden';}, //finale Funktion 1000 //Intervall in Millisekunden ) </script> </body></html> </div>
Edit hier noch ein Link das Problem scheint sich zu bestätigen: http://www.npac795.org/wk/javascript...n-firefox.htmlGeändert von Joe (11.11.11 um 12:57 Uhr) Grund: Weiteren Link hinzugefügt
-
Der beschriebene Bug hat nichts mit deinem Problem zu tun.
Er bezieht sich auf die Argumente, die der Funktion im Timeout übergeben werden. FF übergibt von sich aus ein Argument "lateness", dass ist Differenz zwischen der Zeit, zu der die Funktion hätte aufgerufen werden müssen und der Zeit zu der die Funktion tatsächlich aufgerufen wurde.
Erwartet die Funktion nun Argumente, wird aber skriptseitig nicht immer mit all den erwarteten Argumenten versorgt, kann es zu Fehlverhalten kommen.
Beispiel: http://jsfiddle.net/stNCe/
Code :1 2 3 4 5
function fx(parameter) { alert(typeof parameter); } setTimeout(fx,1000);
Man sollte denken der alert() meldet "undefined"(fx() wird kein Argument übergeben), im FF meldet er aber "Number", denn der Funktion wurde intern das lateness-argument übergeben.
Resumee: Funktionen, die per setTimeout/setInterval aufgerufen werden, skriptseitig immer genau die Anzahl an Argumenten übergeben, welche von der Funktion erwartet werden.
Aber mit deinem Problem hat das nichts zu tun, denn die Funktion run() verarbeitet überhaupt keine Argumente.
Aber trotzdem, interessante Sache, war mir noch nicht bekannt.
-
Ich glaube das es exakt das Timeout-Problem ist. Der Fehler ist das selbe wie wenn ich den Timeout auskommentiere es wird nur die die Zeit aus den php-echo angezeigt und bleibt stehen.
Ich wüsste gerne wie ich den typeof parameter prüfen kann? Wenn er Number ist dann setze halt Timeout nochmal.
Es handelt sich um eine tausendstel Sekunde Verzögerung während des Funktionsdurchlauf was offensichtlich des Lateness feuert. Folgendes klappt bisher und zeigt immer mal die Errormeldung:
Fragt man den Zeitunterschied auf grösser als 1 ab klappt es nicht und bleibt wieder stehen.HTML-Code:</script> <p>Du bist noch <b><span id="countdown">0</span></b> min unterwegs.</p> <script type="text/javascript"> var anzahlAufrufe = 0; ( function(duration,node,action,delay) <!-- Code by Wollmaus @ www.tutorials.de --> { var end = new Date(new Date().getTime()+(duration*1000)).getTime(), format = function(i) { return((i<10)?'0'+i:i); }, run = function() { var now=new Date().getTime(), diff=Math.floor((end-now)/1000), hh=Math.floor(diff/3600), mm=Math.floor((diff-(hh*3600))/60), ss=diff%60; node.innerHTML = top.document.title = [hh,format(mm),format(ss)].join(':'); var secSince1970 = (new Date()).getTime(); if(diff<1) { action(); return; } //setTimeout(run,delay); var secSin2 = (new Date()).getTime(); if(0<secSin2-secSince1970) { anzahlAufrufe++; document.getElementById('Focusoutpt').innerHTML = anzahlAufrufe +'SetTimeoutError'; setTimeout(function(){run();},delay, null,null); //function(){location.href='main.php?section=erkunden';} } else { setTimeout(function(){run();},delay, null,null); } //focoActivo; //self.focus(); } run(); } ) (<?php echo $differenz = $ZeitEndeAktion - $timestamp2;?>, //Laufzeit in Sekunden document.getElementById('countdown'), //Zielelement function(){location.href='main.php?section=erkunden';}, //finale Funktion 1000 //Intervall in Millisekunden ) </script> <p>Focustest <b><span id="Focusoutpt"></span></b></p>
Finde das sehr intressant das es auf diese Tausendstel Sekunde ankommt. Normal würde man denken so ein Quatsch das feuert entweder immer oder garnicht aber meine Fehlermeldung erscheint so ca 1-2 mal. Das klappt sogar in minimiert Zustand. Eine Bugmeldung bei Mozilla beschreibt das es im minimierten Zustand des FF hängenbleibt. Mit meiner Funktion anscheinend nicht. -> Bis jetzt läuft es.
-
Ich nehme stark an das jenes lateness-argument entweder zufällig oder mit der exakten verspäteten Zeit befüllt wird. Das kann dann bedeuten es handelt sich um 1ms und wenn ich richtig gelesen habe feuert das settimeout in den neueren Browsern erst ab 5ms. Genau dieses Verhalten könnte dazu führen das meine Zeit stehen bleibt als hätte ich das settimeout auskommentiert.Man sollte denken der alert() meldet "undefined"(fx() wird kein Argument übergeben), im FF meldet er aber "Number", denn der Funktion wurde intern das lateness-argument übergeben.
Habe versucht eine Variable mit den aktuellen Delay zu füllen also so:
Allerdings kommt es nicht zu Auswetung (if variable!=1000), wenn die Zeit hängen bleibt, warum auch immer.Code :1 2
var variable; setTimeout(function(){run();},variable=delay, null);
Edit ich revidiere der Code oben stoopt auch wenn FF minimiert ist .. Ich gebs auf
Geändert von Joe (12.11.11 um 17:50 Uhr)
Ähnliche Themen
-
Titel anzeigen lassen (Webbrowser - vb 6.0)
Von fm-g1 im Forum Visual Basic 6.0Antworten: 0Letzter Beitrag: 02.01.08, 03:24 -
Inhalt einer Textdatei in Textfeld anzeigen (vorläufiger Titel)
Von green_phanta im Forum Flash PlattformAntworten: 2Letzter Beitrag: 22.11.06, 17:02 -
Aktuellen MP3 Titel mit Flash anzeigen!
Von Sygate im Forum Flash PlattformAntworten: 1Letzter Beitrag: 09.11.05, 16:11 -
Titel in Titelleiste nach Zeit?
Von Spacefunchat im Forum Javascript & AjaxAntworten: 2Letzter Beitrag: 18.12.03, 06:59 -
Titel einer HTML-Datei auslesen
Von mC pAiN im Forum PHPAntworten: 2Letzter Beitrag: 29.11.03, 14:17



10Danke

Zitieren
Login





