tutorials.de Buch-Aktion 05/2012
Seite 2 von 2 ErsteErste 12
ERLEDIGT
JA
ANTWORTEN
22
ZUGRIFFE
879
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #16
    Joe Joe ist offline Mitglied Brokat
    Registriert seit
    Aug 2009
    Ort
    Thüringen
    Beiträge
    339
    @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
    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.
    Das wäre bei mir die Variable $differenz aus obigen PHP-code.
    PHP-Code:
    $differenz $ZeitEndeAktion $timestamp2
    Egal wie unregelmässig die Funktion aufgerufen wird, es wird immer mit der echt vergangenen Zeit hantiert(ich nehme an, darum geht es dir).
    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.

    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".

    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).
    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.
    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.
     

  2. #17
    wollmaus wollmaus ist offline Mitglied Gold
    Registriert seit
    Sep 2010
    Beiträge
    115
    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.
    Joe bedankt sich. 

  3. #18
    Joe Joe ist offline Mitglied Brokat
    Registriert seit
    Aug 2009
    Ort
    Thüringen
    Beiträge
    339
    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)
     

  4. #19
    Joe Joe ist offline Mitglied Brokat
    Registriert seit
    Aug 2009
    Ort
    Thüringen
    Beiträge
    339
    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>
    HTML-Code:
      function setFocus() {
        window.setTimeout("countdown.focus()", 0);
    }
    Vielen dank fürs lesen bzw helfen.
     

  5. #20
    Joe Joe ist offline Mitglied Brokat
    Registriert seit
    Aug 2009
    Ort
    Thüringen
    Beiträge
    339
    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.
    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.
    self-cancel,randomly, in Firefox - selbstabrechend, zufällig im Firefox.

    Tja also teste ich nun die seiner Meinung nach unschöne Lösung
    HTML-Code:
    setTimeout( function(){ do_loop(); }, delay );
    So richtig vertsnaden, was nun das Problem ist, habe ich zwar nicht aber ich teste es mal aus und poste hier das Ergebniss.


    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.html
    Geändert von Joe (11.11.11 um 12:57 Uhr) Grund: Weiteren Link hinzugefügt
    wollmaus bedankt sich. 

  6. #21
    wollmaus wollmaus ist offline Mitglied Gold
    Registriert seit
    Sep 2010
    Beiträge
    115
    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.
    Joe bedankt sich. 

  7. #22
    Joe Joe ist offline Mitglied Brokat
    Registriert seit
    Aug 2009
    Ort
    Thüringen
    Beiträge
    339
    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:
    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>
    Fragt man den Zeitunterschied auf grösser als 1 ab klappt es nicht und bleibt wieder stehen.

    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.
     

  8. #23
    Joe Joe ist offline Mitglied Brokat
    Registriert seit
    Aug 2009
    Ort
    Thüringen
    Beiträge
    339
    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.
    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.

    Habe versucht eine Variable mit den aktuellen Delay zu füllen also so:
    Code :
    1
    2
    
    var variable;
    setTimeout(function(){run();},variable=delay, null);
    Allerdings kommt es nicht zu Auswetung (if variable!=1000), wenn die Zeit hängen bleibt, warum auch immer.

    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

  1. Titel anzeigen lassen (Webbrowser - vb 6.0)
    Von fm-g1 im Forum Visual Basic 6.0
    Antworten: 0
    Letzter Beitrag: 02.01.08, 03:24
  2. Inhalt einer Textdatei in Textfeld anzeigen (vorläufiger Titel)
    Von green_phanta im Forum Flash Plattform
    Antworten: 2
    Letzter Beitrag: 22.11.06, 17:02
  3. Aktuellen MP3 Titel mit Flash anzeigen!
    Von Sygate im Forum Flash Plattform
    Antworten: 1
    Letzter Beitrag: 09.11.05, 16:11
  4. Titel in Titelleiste nach Zeit?
    Von Spacefunchat im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 18.12.03, 06:59
  5. Titel einer HTML-Datei auslesen
    Von mC pAiN im Forum PHP
    Antworten: 2
    Letzter Beitrag: 29.11.03, 14:17

Stichworte