Reiner Wirth: Timeout arbeitet im Firefox, nicht aber im IE

Hallo,

ich bin mal wieder am Ende mit meinem Latein und bräuchte einen lieben Menschen, der mir aus der Patsche hilft. Ich habe mich auf eine Tiemout-Funktion eingelassen, die im Safari und Firefox super gut geht, aber im IE versagt.

Kann jemand sehen, warum?

<script type="text/javascript"><!--
function clickTimer(idEbene, xOff, yOff, idSound)
 {
  Ebene = idEbene;
    Sound = idSound;
    xO = xOff;
    yO = yOff;
    klicks++;
    tout = setTimeout(function()
     {window.clearTimeout();
     if (klicks == 1)
     {
     parent.soundfrm.location.href = Sound;        //-> Sound abgespielen
     } if (klicks == 2) {
     callDHTML(Ebene, xO, yO);    //-> Ebene zeigen
     }
     klicks = 0; } , 250);
  }
 klicks = 0, tout = null;

function callDHTML(id, xO, yO)
 {
 var xN = dd.getScrollX()*1 + xO * 1;
 var yN = dd.getScrollY()*1 + yO * 1;
 dd.elements[id].moveTo(xN, yN);
 dd.elements[id].show();
 topLifter(id);
 }

var zTop=0;
function topLifter(idEbene)
 {
 zTop = zTop + 1;
   document.getElementById(idEbene).style.zIndex=zTop;
 }
//--></script>

Vielen Dank schon mal!

Gruß Reiner Wirth

  1. Prüfe mal, ob in der folgenden beiden Zeilen die Klammern so gewollt sind. Mir fällt auf den ersten Blick aus, es ist eine "(" zu der eine ")". Ist auch "{" in der zweiten Zeile so gewollt?

    tout = setTimeout(function()
         {window.clearTimeout();

    Ist in der folgenden Zeile "}" hinter "klicks = 0;" so richtig?

    klicks = 0; } , 250);
      }

    Ich hatte auch schon fehler, die vom IE "verziehen" wurden, jedoch vom FF nicht. Überprüfe mal deine Klammern.
    Gruß Freddy und viel Erfolg!

    1. Prüfe mal, ob in der folgenden beiden Zeilen die Klammern so gewollt sind. Mir fällt auf den ersten Blick aus, es ist eine "(" zu der eine ")". Ist auch "{" in der zweiten Zeile so gewollt?

      tout = setTimeout(function()
           {window.clearTimeout();
      Ist in der folgenden Zeile "}" hinter "klicks = 0;" so richtig?
           klicks = 0; } , 250);
        }
      Ich hatte auch schon fehler, die vom IE "verziehen" wurden, jedoch vom FF nicht. Überprüfe mal deine Klammern.
      Gruß Freddy und viel Erfolg!

      Bin ich eigentlich sicher, den Trick hat mir Struppi verraten, man nennt das implizite Funktion.

      Ich werde se noch mal anders versuchen, vielleicht ist das ein Hinweis für etwas, was IE nicht mag.

      Dank erst mal.

      Reiner Wirth

  2. Immer noch ;-)

    Kann jemand sehen, warum?

    <script type="text/javascript"><!--
    function clickTimer(idEbene, xOff, yOff, idSound)
    {
      Ebene = idEbene;
        Sound = idSound;
        xO = xOff;
        yO = yOff;
        klicks++;
        tout = setTimeout(function()
         {window.clearTimeout();

    clearTimeout ist hier absolut unnötig, zumlsa auch der Parameter fehlt (vielleicht ist das die Ursache)

    if (klicks == 1)
         {
         parent.soundfrm.location.href = Sound;        //-> Sound abgespielen
         } if (klicks == 2) {
         callDHTML(Ebene, xO, yO);    //-> Ebene zeigen
         }
         klicks = 0; } , 250);

    Die Klammern scheinen zu stimmen (man nennt es übrigens anonyme Funktion), du kanst es dir hier aber einfacher machen und die Klamern bei dem if weglassen:

    window.setTimeout(  
    function()  
    {  
    if (klicks == 1) parent.soundfrm.location.href = Sound;  
    else if (klicks == 2) callDHTML(Ebene, xO, yO);  
    klicks = 0;  
    }  
    , 250);  
    
    

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. Die Klammern scheinen zu stimmen (man nennt es übrigens anonyme Funktion), du kanst es dir hier aber einfacher machen und die Klamern bei dem if weglassen:

      window.setTimeout(

      function()
      {
      if (klicks == 1) parent.soundfrm.location.href = Sound;
      else if (klicks == 2) callDHTML(Ebene, xO, yO);
      klicks = 0;
      }
      , 250);

      
      >   
      > Struppi.  
        
        
      Ich habe jetzt nochmal auf die zumindest für mich übersichtlichere Fassung mit den getrennten Funktionen "umgesattelt" und habe festgestellt, dass der IE jetzt nach 3x Klick das tut, was ich möchte. Gibt es dafür eine Erklärung?? Ich häts ja gern schon nach 2 Klicks. Immer dieser IE.  
        
      function clickTimer(idEbene, xOff, yOff, idSound)  
       {  
        Ebene = idEbene;  
          Sound = idSound;  
          xO = xOff;  
          yO = yOff;  
          klicks++;  
          tout = window.setTimeout('clickErgebnis()',700); //-> Ebene zeigen  
         }  
       klicks = 0, tout = null;  
        
      function clickErgebnis()  
        {  
         window.clearTimeout(tout);  
         if (klicks == 1)  
          {  
          parent.soundfrm.location.href = Sound;  //-> Sound abgespielen  
          } else {  
          callDHTML(Ebene, xO, yO);    //-> Ebene zeigen  
          }  
         klicks = 0;  
        }  
        
      function callDHTML(id, xO, yO)  
       {  
       var xN = dd.getScrollX() \* 1 + xO \* 1;  
       var yN = dd.getScrollY() \* 1 + yO \* 1;  
       dd.elements[id].moveTo(xN, yN);  
       dd.elements[id].show();  
       topLifter(id);  
       alert(zTop);  
       }  
        
      var zTop=0;  
      function topLifter(idEbene)  
       {  
       zTop = zTop + 1;  
         document.getElementById(idEbene).style.zIndex=zTop;  
       }  
        
        
      Reiner
      
      1. Ich habe jetzt nochmal auf die zumindest für mich übersichtlichere Fassung mit den getrennten Funktionen "umgesattelt" und habe festgestellt, dass der IE jetzt nach 3x Klick das tut, was ich möchte. Gibt es dafür eine Erklärung?? Ich häts ja gern schon nach 2 Klicks. Immer dieser IE.

        Kann es sein, dass der IE die onclick Funktion bei einem Doubleclick nicht aufruft?

        window.clearTimeout(tout);

        Wie gesagt das ist überflüssig!
        Damit unterbrichst du einen Timeout, der aber hier schon beendet ist. Die Variabel tout brauchst du nicht.

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. Ich habe jetzt nochmal auf die zumindest für mich übersichtlichere Fassung mit den getrennten Funktionen "umgesattelt" und habe festgestellt, dass der IE jetzt nach 3x Klick das tut, was ich möchte. Gibt es dafür eine Erklärung?? Ich häts ja gern schon nach 2 Klicks. Immer dieser IE.

          Kann es sein, dass der IE die onclick Funktion bei einem Doubleclick nicht aufruft?

          wenn ich statt klicks= 0    klicks = 1 vordefiniere, dann reichen 2 Klicks beim IE, das funktioniert aber nur einmal. Ich schau nicht durch. Muß der IE denn immer so anders sein als die anderen?

          window.clearTimeout(tout);

          Wie gesagt das ist überflüssig!
          Damit unterbrichst du einen Timeout, der aber hier schon beendet ist. Die Variabel tout brauchst du nicht.

          Struppi.

          eben doch,
          wenn ich den Tiemout nicht unterbreche, wird beim FF und Safari beim Doppelklick die callDHTML(id, xO, yO) zweimal aufgerufen, auch komisch oder? Außerdem wird zTop zweimal erhöht, das schadet zwar nichts, aber es ist unnütz.

          Es gibt Sachen…

          Reiner

        2. Kann es sein, dass der IE die onclick Funktion bei einem Doubleclick nicht aufruft?

          Struppi.

          hier hat Struppi recht.

          Kann mir jemand sagen, warum bei

          function identClick (Ereignis) {
            if (!Ereignis)
            Ereignis = window.event;
            if (Ereignis.button) {
            alert("Button = "+Ereignis.button);
            }
           }
           document.onmousedown = identClick;

          der IE linke Maustaste mit 1 und rechte mit 2 beantwortet, Firefox aber nur die rechte Maustaste erkennt?

          Reiner

          1. der IE linke Maustaste mit 1 und rechte mit 2 beantwortet, Firefox aber nur die rechte Maustaste erkennt?

            Vieleicht hilft das weiter http://www.quirksmode.org/js/events_properties.html

            Struppi.

            --
            Javascript ist toll (Perl auch!)
            1. der IE linke Maustaste mit 1 und rechte mit 2 beantwortet, Firefox aber nur die rechte Maustaste erkennt?

              Vieleicht hilft das weiter http://www.quirksmode.org/js/events_properties.html

              Struppi.

              das ist eine Super-Seite, die sehr hilfreich ist in dem Gestrüpp der Inkompatibilitäten, danke fafür.

              Hier aber leider noch eine Anfängerfrage:

              Wenn ich meine Funktion so erweitere, damit der IE gesondert behandelt wird, da er ja jetzt nach allem, was ich weiß "richtig" auf click und dblclick reagiert und getrennte eineindeutige Verzweigungen zulässt, dann arbeitet event.type nicht so, wie ich erwartet hatte. Ich möchte eigentlich nur click und dblclclick erkennen und ihnen 2 verschiedene Aufgaben zuweisen. Ich bin leider wieder nicht dazu fähig. Bitte um einen Tipp.

              var name_des_browsers;
              function clickTimer(idEbene, xOff, yOff, idSound)
              {
              Ebene=idEbene;
              Sound=idSound;
              xO=xOff;
              yO=yOff;
              name_des_browsers=navigator.appName
              if (name_des_browsers == "Microsoft Internet Explorer") {
              if (event.type == "CLICK")
              {
              parent.soundfrm.location.href = Sound;        //-> Sound abgespielen
              }
              else if (event.type == "DDBLCLICK")
              {
              callDHTML(Ebene, xO, yO);      //-> Ebene zeigen
              }
              return;
              }
              klicks++;
              tout = setTimeout(function(){
              if (klicks == 1)
              {
              parent.soundfrm.location.href = Sound;        //-> Sound abgespielen
              } else {
              callDHTML(Ebene, xO, yO); //-> Ebene zeigen
              }
              klicks = 0; }, 500);
              }
              klicks = 0;

              function callDHTML(id, xO, yO)
               {
               var xN=dd.getScrollX()*1+xO*1;
               var yN=dd.getScrollY()*1+yO*1;
               dd.elements[id].moveTo(xN, yN);
               dd.elements[id].show();
               topLifter(id);
               }

              1. der IE linke Maustaste mit 1 und rechte mit 2 beantwortet, Firefox aber nur die rechte Maustaste erkennt?

                Vieleicht hilft das weiter http://www.quirksmode.org/js/events_properties.html

                Struppi.

                ok, das geht jetzt zum Glück, allerdings mit einem Schönheitsfehler:

                Ich verwende 2 mal denselben Event onclick. Ich habe zwar in Selfhtml eine Lösung gefunden:

                Struppis Vorschlag

                document.onmousemove = verteile(e)
                {
                   fkt1(e);
                   fkt2(2);
                }

                Leider konnte ich diese wunderbare Lösung nicht anwenden

                Bei mir sind es zwei Stellen

                1.

                function stopSound(){  //-> um laufenden Sound zu stoppen, "Stille" ladenparent.soundfrm.location.href = "../Sound1/stille.html";
                }
                document.onclick = stopSound;

                2.

                var name_des_browsers;
                function clickTimer(idEbene, xOff, yOff, idSound)
                {
                Ebene=idEbene;
                Sound=idSound;
                xO=xOff;
                yO=yOff;
                name_des_browsers=navigator.appNam
                if (name_des_browsers == "Microsoft Internet Explorer") {
                parent.soundfrm.location.href = Sound;        //-> Sound abgespielen
                return;
                }
                klicks++;
                tout = setTimeout(function(){
                if(klicks==1)
                {
                parent.soundfrm.location.href = Sound;    //-> Sound abgespielen
                } else {
                callDHTML(Ebene, xO, yO); //-> Ebene zeigen
                topLifter(Ebene);
                }
                klicks = 0; }, 500);
                }
                klicks = 0;

                Die Funktion clickTimer(idEbene, xOff, yOff, idSound)

                wird so aufgerufen:

                <area title="Klick: abspielen | Doppelklick: anzeigen" onclick="clickTimer('Bsp6' ,'50' ,'50', '../Sound1/06.html')" shape="rect" coord …

                Entsprechend Struppis Vorschlg würde dann stehen

                document.onclick = verteile(e);
                {
                stopSound(e);
                clickTimer(2, idEbene, xOff, yOff, idSound);
                }

                Darf man denn die 2 noch als zusätzliches Argument aufnehmen und müßte dann im Aufruf stehen?

                <area title="Klick: abspielen | Doppelklick: anzeigen" onclick="clickTimer('2', 'Bsp6', '50', '50', '../Sound1/06.html')" shape="rect" coord …

                So habe ich es probiert, der Aufruf der Ebene in ClickTimer erfolgt dann nicht, alles andere geht.

                Reiner

                1. Entsprechend Struppis Vorschlg würde dann stehen

                  document.onclick = verteile(e);
                  {
                  stopSound(e);
                  clickTimer(2, idEbene, xOff, yOff, idSound);
                  }

                  Darf man denn die 2 noch als zusätzliches Argument aufnehmen und müßte dann im Aufruf stehen?

                  Ich weiß ja nicht was die 2 als Paraemter machen soll, aber du musst natürlich auch die Funktion entsprechend anpassen.

                  <area title="Klick: abspielen | Doppelklick: anzeigen" onclick="clickTimer('2', 'Bsp6', '50', '50', '../Sound1/06.html')" shape="rect" coord …

                  übrigens gibt es in JS durchaus auch Zahlen, d.h. du musst nicht alle Parameter als String übergeben.

                  Struppi.

                  --
                  Javascript ist toll (Perl auch!)
                  1. Entsprechend Struppis Vorschlg würde dann stehen

                    document.onclick = verteile(e);
                    {
                    stopSound(e);
                    clickTimer(2, idEbene, xOff, yOff, idSound);
                    }

                    Darf man denn die 2 noch als zusätzliches Argument aufnehmen und müßte dann im Aufruf stehen?

                    Ich weiß ja nicht was die 2 als Paraemter machen soll, aber du musst natürlich auch die Funktion entsprechend anpassen.

                    Struppi.

                    ich habe mich wahrscheinlich nicht gut ausgedrückt.

                    Ich zitiere mal, was Struppi früher gesagt hat:

                    wie kann ich das trotzdem erreichen?

                    eventuell mit einer verteilerfunktion:
                    code:

                    funktion verteile(e)
                    {
                      fkt1(e);
                      fkt2(2);
                    }

                    document.onmousemove = verteile;

                    Das geht.

                    gibt es eine elegantere variante?

                    Kommt drauf an, was du unter elegant verstehst.
                    Es geht noch folgendes
                    document.onmousemove = verteile(e)
                    {
                       fkt1(e);
                       fkt2(2);
                    }

                    Struppi.

                    genau das möchte ich, das "doppelt belegte onclick" aufspltten und gezielt auf die eine oder andere Funktion zugreifen

                    Meine Funktion 1:

                    function stopSound(e){
                    parent.soundfrm.location.href = "../Sound1/stille.html";
                    }
                    document.onclick = stopSound;

                    meine Funktion 2:

                    function clickTimer(2, idEbene, xOff, yOff, idSound)
                     {…}

                    und die verteile Funktion

                    function document.onclick = verteile(e);
                    {
                    stopSound(e);
                    clickTimer(2, idEbene, xOff, yOff, idSound);
                    }

                    der eine "Aufruf" stopSound(e) soll immer bei onclick irgendwo auf "document" erfolgen, der andere bei Aufruf:

                    <area title="Klick: abspielen | Doppelklick: anzeigen" onclick="clickTimer('2', 'Bsp10', '100', '300', '../Sound1/10.html')" coords="664,300,738,332" alt=""
                    ondblclick="ieDblclick('Bsp10', '100', '300')" coords="664,300,738,332" alt="">

                    wobei ondblclcik eine Spezialbehandlung (eigene Funktion ieDblclick) für den IE ist, weil der ja den Doppelklick so schön alleine erkennt, das ist hier aber zweitrangig. Ich schreibe es nur der Vollständigkeit halber hin. Bei allen anderen Browsern wird ja alles in clikTimer entschieden. Ich hoffe, das Problem kommt jetzt klarer rüber.

                    ob ich den Parameter »2« als Zahl oder String übergebe wirkt sich im Moment nicht aus. Die clicks werden gar nicht mehr beachtet. Ich "zerstöre" offenbar  im Moment den event-Handler. Ich kanns im Moment nicht besser ausdrücken.

                    Reiner