Karl Kowald: window.onblur & window.onfocus

Hallo, ich möchte einen Timer laufen lassen, wenn eine Seite im Vordergrund ist, aber der Timer soll stoppen, wenn die Seite in den Hintergrund geht (minimiert, andere Seite im Vordergrund etc.)

Folgende Situation:
Frameset --> 80% Seite mit diversen Inhalten
20% Seite mit dem Timer, wo das javascript ausgeführt wird.

Ich hab den Timer fix und fertig, er wird nur mehr ausgeführt, wenn eine Variable auf 1 gesetzt ist. Diese Variable behandle ich wie folgt:

[CODE]
window.captureEvents(Event.blur | Event.focus);
window.onfocus = startt();
window.onblur = stopp();
function startt()
{
 Aktiv = 1;
}
function stopp()
{
 Aktiv = 0;
}
[/CODE]

Leider funktioniert das nicht so wie es soll, wenn ich die window.onblur-aktion auskommentiere, dann läuft der Zähler ohne probleme, sobald das so drinnen steht, läuft der Timer einfach nicht mehr.

Woran liegt das, was muss ich anders machen??

Danke im Vorraus für eure Hilfe.

MfG
  Karl Kowald

  1. Okay.. falls mit diesen zweien nichts zu machen ist.

    Ist es überhaupt möglich mit Javascript abzufragen, ob eine Seite gerade im Vordergrund (activ/focus) ist?

    am liebsten wäre mir sowas wie:

    while (x != 0)
    {
    if(Seite im Vordergrund(aktiv/focus))
    {
      blubb = 1;
    }
    else
    {
      blubb = 0;
    }
    }

    Mir ist klar, das das mit javascript nicht in dieser logik funktioniert, aber eventuell hab ich somit eher klar gemacht, was ich erreichen möchte.

    Bitte um hilfe. Danke

    1. Mahlzeit.

      Bau doch in den Timer, da wo raufgezählt wird einfach die Abfrage:

      if(window.focus==true)

      Dann wird nur raufgezählt/herabgezählt, wenn sich das Fenster im Focus befindet. Wenn nicht, läuft zwar die Funktion weiter, aber es wird nicht gezählt

      MFG
      Griever

      --
      LOOK MY PAGE!
      1. Tag griever.

        Bau doch in den Timer, da wo raufgezählt wird einfach die Abfrage:
        if(window.focus==true)

        Wie kommst du darauf, dass window eine Eigenschaft focus hat?

        Siechfred

        1. Mahlzeit.

          Zumindestens ist das so bei  IE 3.x. Weiß nicht, wies bei den anderen Browsern is.

          MFG
          Griever

          --
          LOOK MY PAGE!
          1. Zumindestens ist das so bei  IE 3.x. Weiß nicht, wies bei den anderen Browsern is.

            Dann hast du ein undokumentiertes Feature gefunden, denn selbst im MSDN taucht die Eigenschaft nicht auf. Übrigens, mein IE 5.0 unter Win2k kennt die Eigenschaft auch nicht.

            Siechfred

            1. Mahlzeit.

              Ich weiß auch nicht, warum. Aber bei meinem IE 3.0 um genau zu sein, kennt diese Funktion. Nun, dann muss ich doch einfach was anderes machen. Vielleicht auf der Seite im Body Tag.

              Ist doch eine sehr einfache Sache, eigentlich ...

              onBlur="wert=0" onFocus="wer=1">

              MFG
              Griever

              --
              LOOK MY PAGE!
              1. Ich weiß auch nicht, warum. Aber bei meinem IE 3.0 um genau zu sein, kennt diese Funktion. Nun, dann muss ich doch einfach was anderes machen. Vielleicht auf der Seite im Body Tag.

                Den IE 3 benutz seit 1998 keiner mehr, bist du sicher das so eine alte Mühle hast?

                onBlur="wert=0" onFocus="wer=1">

                Das ist etwas komplett anderes als du vorher geschrieben hast. Damit sagst du den Eventhandlern was sie machen sollen, wenn der Event auftritt. Warum benutzt du eigentlich gemischte Schreibweise? Du solltest Großbuchstaben in HTML Attributen vermeiden, spätestens wenn du XHTML verwendest hast du ansonsten ungültigen Code.

                Struppi.

              2. Ich weiß auch nicht, warum. Aber bei meinem IE 3.0 um genau zu sein, kennt diese Funktion.

                Du weißt doch sicher um den Unterschied zwischen Eigenschaft und Methode. Selbstverständlich hat das window-Objekt eine Methode focus, aber keine Eigenschaft, ergo wird deine Abfrage immer false ergeben. Und was den IE 3 angeht, in der Steinzeit hat der Mann die Frau angeknurrt, wenn er was von ihr wollte, versuch das mal heutzutage ;-)

                Siechfred

                1. Hallo,

                  Du weißt doch sicher um den Unterschied zwischen Eigenschaft und Methode. Selbstverständlich hat das window-Objekt eine Methode focus, aber keine Eigenschaft, ergo wird deine Abfrage immer false ergeben.

                  Das ist falsch.
                  Methoden sind in JavaScript nichts anderes als spezielle Eigenschaften des Typs function. Sie verhalten sich in jeder Hinsicht wie Eigenschaften und können auch so angesprochen werden. Wenn eine Methode namens focus beim window-Objekt existiert, kann man über window.focus das entsprechende Function-Objekt ansprechen. Und also prüfen, ob eine solche Methode existiert. alert(window.focus); geht, if (window.focus) geht also auch. if (window.focus == true) ist identisch. Der einzige Unterschied zu Eigenschaften eines anderen Typs ist die interne [[Call]]-Methode, sodass man die Methode als Funktion über Funktionsname(Argumentliste) aufrufen kann.
                  Wenn man eigene globale Funktionen mit function bla () {} notiert, kommt auch nichts anderes als eine Eigenschaft des Typs function (= Methode) beim window-Objekt heraus (window.bla).

                  Mathias

                  1. Tag molily.

                    Methoden sind in JavaScript nichts anderes als spezielle Eigenschaften des Typs function. Sie verhalten sich in jeder Hinsicht wie Eigenschaften und können auch so angesprochen werden.

                    Nein, nicht so, wie in dem genannten Kontext.

                    Wenn eine Methode namens focus beim window-Objekt existiert, kann man über window.focus das entsprechende Function-Objekt ansprechen.

                    Soweit Zustimmung.

                    Und also prüfen, ob eine solche Methode existiert. alert(window.focus); geht, if (window.focus) geht also auch. if (window.focus == true) ist identisch.

                    Ersteres liefert in allen drei Testbrowsern (FF 1.0.7, IE 6.0 und Opera 8.5) das Ergebnis:

                    function focus() {  
                      [native code]  
                    }
                    

                    Letzteres funktioniert hier in keinem der Browser wie erwartet. Folgenden Testcode habe ich verwendet:

                    alert(typeof window.focus); // 'object' im IE, 'function' in FF und Opera  
                    if(window.focus == true)  
                      alert("focus ist true");  
                    else alert ("focus ist false"); // alle drei landen im else-Zweig
                    

                    Lediglich if(window.focus) ergibt den Wert true. Dieses Verhalten hatte ich bereits vor meinem ersten Posting beobachtet. Warum das so ist, mag ich für den Moment nicht recherchieren.

                    Siechfred

                    1. Hallo,

                      if(window.focus == true)

                      alert("focus ist true");
                      else alert ("focus ist false"); // alle drei landen im else-Zweig

                        
                      Interessant, damit hätte ich nicht gerechnet. Das muss eine seltsame Sonderregelung sein. Ich dachte, ein Function-Objekt sei == true. Dasselbe hätte ich auch von einem Object-Objekt erwartet. In beiden Fällen ist es nicht der Fall.  
                      Ich habe mir x == true immer so vorgestellt: Der Operator == erfordert Boolesche Werte auf beiden Seiten des Operators, als wird auf beide Werte, sofern sie nicht schon Boolean sind, Boolean() angewendet: x == true wird intern erst einmal in Boolean(x) == true »umgeschrieben«. Und da Boolean(FunctionObjekt) true ergibt, dachte ich, dass FunctionObjekt == true ebenfalls true ergibt. Ich dachte, dasselbe wird bei if (x) angewendet: if (Boolean(x)).  
                        
                      Mathias
                      
                      1. Tag molily.

                        Interessant, damit hätte ich nicht gerechnet. Das muss eine seltsame Sonderregelung sein. Ich dachte, ein Function-Objekt sei == true. Dasselbe hätte ich auch von einem Object-Objekt erwartet. In beiden Fällen ist es nicht der Fall.

                        Eine mögliche Erklärung wäre der Kontext der Abfrage. if(function) ist scheinbar etwas anderes als if(function == true). Ersteres fragt die Existenz von function ab und ist true, wenn sie existiert und false, wenn sie nicht existiert.

                        Bei der zweiten Variante wird m.E. der "Wert" von function abgefragt, und der ist vom Typ String; das ominöse [native code], das man auch bei alert(function) erhält. Also liegt kein boolescher Wert vor, und die Abfrage wird immer false ergeben.

                        Ich habe mir x == true immer so vorgestellt: Der Operator == erfordert Boolesche Werte auf beiden Seiten des Operators, als wird auf beide Werte, sofern sie nicht schon Boolean sind, Boolean() angewendet: x == true wird intern erst einmal in Boolean(x) == true »umgeschrieben«. Und da Boolean(FunctionObjekt) true ergibt, dachte ich, dass FunctionObjekt == true ebenfalls true ergibt. Ich dachte, dasselbe wird bei if (x) angewendet: if (Boolean(x)).

                        Vielleicht mal ein anderes Beispiel. Angenommen, ich habe eine Eigenschaft "foo" vom Typ String mit dem Wert bar, also so:

                        foo = "bar";  
                        alert(typeof window.foo); // 'String'  
                        if(window.foo) alert("foo existiert"); // Meldung erscheint  
                        if(window.foo = true) alert("foo ist true"); // keine Meldung  
                        if(window.foo == "bar") alert("foo ist bar"); // Meldung erscheint
                        

                        Dieses Beispiel demonstriert meine Vermutungen. Eine Abfrage if(foo) prüft die Existenz von foo, egal, ob Eigenschaft, Methode oder Objekt. Die Abfrage if(foo == wert) prüft, ob foo den Wert "wert" hat, und genau das funktioniert nur bei Eigenschaften, nicht aber bei Methoden oder Objekten. Es scheint sich also um eine Art "value of"-Abfrage zu handeln.

                        Siechfred

                        1. *grmpf*

                          if(window.foo = true) alert("foo ist true"); // keine Meldung

                          if(window.foo == true) alert("foo ist true"); // keine Meldung

                          (ändert aber nichts, war nur ein C&P-Fehler)

                          Siechfred

                        2. Hallo,

                          Bei der zweiten Variante wird m.E. der "Wert" von function abgefragt, und der ist vom Typ String; das ominöse [native code], das man auch bei alert(function) erhält. Also liegt kein boolescher Wert vor, und die Abfrage wird immer false ergeben.

                          Das kann man so nicht sagen, ein Function-Objekt hat keinen String-Wert. alert() nimmt erst einmal alle möglichen Objekte entgegen und führt automatisch ein Funktion.toString() durch. In Ausdrücken, in denen ein String erfordert wird, ist das ebenso, zum Beispiel:
                          Wert = Funktion + "";
                          Ruft intern Funktion.toString() auf, um diesen Wert mit dem anderen String zu verketten.
                          Ich sehe nicht, dass bei Funktion == true Funktion.toString() aufgerufen werden muss. Und selbst wenn, das verschiebt die Frage nur. Warum ergibt Boolean("bla") true, "bla" == true aber false?

                          Allerdings:
                          http://bclary.com/2004/11/07/ecma-262.html#a-11.9.3
                          18. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
                          Bleibt function == 1
                          Dann wohl:
                          20. If Type(x) is either String or Number and Type(y) is Object, return the result of the comparison x == ToPrimitive(y).
                          Object: Return a default value for the Object. The default value of an object is retrieved by calling the internal [[DefaultValue]] method of the object, passing the optional hint PreferredType. The behaviour of the [[DefaultValue]] method is defined by this specification for all native ECMAScript objects (8.6.2.6).
                          Das verstehe ich dann nicht mehr. Es scheint mir aber möglich, dass bei einer Umwandlung einer Funktion in einen primitive value toString verwendet wird.
                          Dann hätte man "function bla () { ... }" == 1
                          Dann käme
                          17. If Type(x) is String and Type(y) is Number, return the result of the comparison ToNumber(x)== y.
                          Wenn ich das richtig sehe, käme heraus
                          NaN == 1
                          Ja, das ist dann tatsächlich false. ;)

                          foo = "bar";

                          alert(typeof window.foo); // 'String'
                          if(window.foo) alert("foo existiert"); // Meldung erscheint
                          if(window.foo == true) alert("foo ist true"); // keine Meldung
                          if(window.foo == "bar") alert("foo ist bar"); // Meldung erscheint

                          
                          >   
                          > Dieses Beispiel demonstriert meine Vermutungen. Eine Abfrage if(foo) prüft die Existenz von foo, egal, ob Eigenschaft, Methode oder Objekt. Die Abfrage if(foo == wert) prüft, ob foo den Wert "wert" hat, und genau das funktioniert nur bei Eigenschaften, nicht aber bei Methoden oder Objekten.  
                            
                          Das verstehe ich nicht. Oder du sagst etwas selbstverständliches. Natürlich sind Methoden und Objekte keine »primitive values«.  
                            
                          Mathias
                          
                          1. Tag molily.

                            Ich sehe nicht, dass bei Funktion == true Funktion.toString() aufgerufen werden muss. Und selbst wenn, das verschiebt die Frage nur. Warum ergibt Boolean("bla") true, "bla" == true aber false?

                            Naja, die Antwort kann ich anhand der von dir verlinkten Dokumentation nur ahnen. Wenn ich die Ausführungen in 12.5 richtig verstehe, liegt es wohl an der Abarbeitung von "Expression". Ist diese der Name einer Variable, Funktion oder eines Objektes, wird zunächst GetValue(foo) aufgerufen, die den Type von foo zurückgibt. Dieser liefert dann nach den Regeln für ToBoolean true oder false. Damit ist die Abfrage erledigt. Mal ein Beispiel:

                            foo = "";  
                            if(foo) alert ("foo!");
                            

                            Nichts passiert. Kann auch nicht, denn GetValue ergibt einen leeren String, der nach den Regeln für ToBoolean false ergibt. Anders verhält es sich beim Equals-Operator. Wenn ich das richtig verstehe, würde foo == true zu GetValue(foo) == GetValue("true"), erst danach geht's weiter mit 11.9.3.

                            Im Ergebnis wäre doch GetValue(foo) vom Typ Object o.ä. (jedenfalls kein Primitive Value), während GetValue("true") ein Primitive Value vom Typ "Boolean" ergäbe, oder? Damit läge keine Typengleichheit vor, und man überspringt 1. bis 13. und landet in der Folge beim einzig passenden Eintrag "19. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y)." ToNumber("true") ergibt 1, also m.E. keine Übereinstimmung, sodass man schlussendlich bei "22. Return false." landet.

                            Eine Abfrage if(foo) prüft die Existenz von foo, egal, ob Eigenschaft, Methode oder Objekt. Die Abfrage if(foo == wert) prüft, ob foo den Wert "wert" hat, und genau das funktioniert nur bei Eigenschaften, nicht aber bei Methoden oder Objekten.
                            Das verstehe ich nicht. Oder du sagst etwas selbstverständliches. Natürlich sind Methoden und Objekte keine »primitive values«.

                            Eben. Aus diesem Grund ist es nach meiner Meinung nicht ohne weiteres möglich, die Existenz einer Methode mittels if(foo == true) abzufragen, und genau darauf wollte ich eigentlich hinaus (Stein des Antoßes):

                            Du weißt doch sicher um den Unterschied zwischen Eigenschaft und Methode. Selbstverständlich hat das window-Objekt eine Methode focus, aber keine Eigenschaft, ergo wird deine Abfrage immer false ergeben.

                            Diese Aussage ist also so lange richtig, bis nicht eine Eigenschaft mit dem Namen focus und dem Wert "true" selbst definiert wird.

                            Oder etwa nicht?

                            Siechfred

              3. Hi,

                Ist doch eine sehr einfache Sache, eigentlich ...

                onBlur="wert=0" onFocus="wer=1">

                Im BODY-Tag?

                onBlur/onFocus gehört (mittlerweile nicht mehr?) dem document, sondern dem window!

                Du kannst also in neueren Browsern die venthandler entsprechend nutzen. Bedingung:

                if(window.focus) ...

                Dann wird der Code der Bed. nur ausgeführt, wenn der Browser es beherrscht (IIRC ab JavaScript 1.1).

                Gruß, Cybaer

                --
                Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
  2. Ich hab den Timer fix und fertig, er wird nur mehr ausgeführt, wenn eine Variable auf 1 gesetzt ist. Diese Variable behandle ich wie folgt:

    [CODE]
    window.captureEvents(Event.blur | Event.focus);
    window.onfocus = startt();
    window.onblur = stopp();

    Hast du dir mal ausgeben lassen, was du hier den Eventhandler zuweist?
    alert( startt() );
    alert( stopp() );

    dürfte jeweils undefined ergeben, somit überschreibst du lediglich die Eventhandler.

    Du möchtest ihnen die Funktionsreferenz übergeben. d.h. den Funtionsnamen ohne Klammern.

    Struppi.