Twilo: IE ruft eine Funktion nicht auf

Hallo,

da ich kein nativen Internet Explorer habe, teste ich mit ein IE 6 über wine (IE4Linux)

ich habe das Problem, dass der IE folgenes Konstrukt nicht ausführt

// ...  
    var colors = new Array('#00C', '#DDF'); // background, color  
// ...  
    function setActive(Element){  
        alert('test');  
        if(document.getElementById(Element)){  
            document.getElementById(Element).style.backgroundColor = colors[0];  
            document.getElementById(Element).style.color = colors[1];  
        }  
        else{  
            Element.style.backgroundColor = colors[0];  
            Element.style.color = colors[1];  
        }  
    }  
// ...

<a href=":export-xxx.html" target="Main" onclick="setActive(this);">

Wenn ich statt "this" eine ID-Namen übergebe, erscheint die Messagebox und die Hintergrundfarbe wird bei dieser ID geändert.

Skriptfehler werden nicht ausgegeben.
"Skriptdebugging deaktivieren" ist deaktiviert und "Skriptfehler anzeigen" ist aktiviert.

Iceweacel (Firefox) 2.0.0.14 und Opera 9.50 Beta 2 (Build
1962) setzen die Hintergrundfarbe wie gewünscht.

Könnte es daran liegen, dass ich keinen nativen IE verwendet?

mfg
Twilo

  1. Hallo,

    ich habe das Problem, dass der IE folgenes Konstrukt nicht ausführt

    // ...

    var colors = new Array('#00C', '#DDF'); // background, color
    // ...
        function setActive(Element){
            alert('test');
            if(document.getElementById(Element)){
                document.getElementById(Element).style.backgroundColor = colors[0];
                document.getElementById(Element).style.color = colors[1];
            }
            else{
                Element.style.backgroundColor = colors[0];
                Element.style.color = colors[1];
            }
        }
    // ...

    
    > `<a href=":export-xxx.html" target="Main" onclick="setActive(this);">`{:.language-html}  
      
    nachdem ich den Funktionsnamen geändert habe, funktioniert das Skript wie gewünscht.  
      
    mfg  
    Twilo  
    
    -- 
    [Farbtabelle](http://www.farb-tabelle.de)
    
    1. Hi,

      function setActive(Element){

      nachdem ich den Funktionsnamen geändert habe, funktioniert das Skript wie gewünscht.

      </archiv/2008/1/t164391/#m1071473>

      MfG ChrisB

      --
      "The Internet: Technological marvel of marvels - but if you don't know *what* you're lookin' for on the Internet, it is nothing but a time-sucking vortex from hell."
      1. Hallo,

        function setActive(Element){

        nachdem ich den Funktionsnamen geändert habe, funktioniert das Skript wie gewünscht.

        </archiv/2008/1/t164391/#m1071473>

        ich hatte nach einigen Sachen gesucht, aber nicht direkt nach den Funktionsnamen.
        Nach den Funktionsnamen hatte ich erst gesucht, nachdem die Funktion nach der Namensänderung funktionierte ;-)

        mfg
        Twilo

  2. Hallo,

    function setActive(Element){
            alert('test');
            if(document.getElementById(Element))

    offensichtlich erwartet deine Funktion als Parameter die ID eines HTML-Elements - also einen einfachen String.

    <a href=":export-xxx.html" target="Main" onclick="setActive(this);">

    Und hier übergibst du gleich ein komplettes HTML-Elementobjekt. Das *kann* nicht funktionieren.
    Entweder du übergibst hier nur this.id, das wäre die weniger effiziente Lösung, oder du belässt es bei this, kannst dir dann aber innerhalb der Funktion die Verrenkungen mit getElementById() sparen - denn du hast dann bereits die komplett aufgelöste Referenz auf das Element.

    Wenn ich statt "this" eine ID-Namen übergebe, erscheint die Messagebox und die Hintergrundfarbe wird bei dieser ID geändert.

    Eben. :-)

    Skriptfehler werden nicht ausgegeben.
    "Skriptdebugging deaktivieren" ist deaktiviert und "Skriptfehler anzeigen" ist aktiviert.

    Oops. Das überrascht mich.

    Iceweacel (Firefox) 2.0.0.14 und Opera 9.50 Beta 2 (Build
    1962) setzen die Hintergrundfarbe wie gewünscht.

    Oops. Das überrascht mich noch viel mehr.

    Könnte es daran liegen, dass ich keinen nativen IE verwendet?

    Nein - dann müssten sich trotzdem wenigstens Opera und Firefox erwartungskonform verhalten.

    So long,
     Martin

    --
    "Drogen machen gleichgültig."
     - "Na und? Mir doch egal."
    1. Hallo,

      function setActive(Element){
              alert('test');
              if(document.getElementById(Element))

      offensichtlich erwartet deine Funktion als Parameter die ID eines HTML-Elements - also einen einfachen String.

      hast du auch noch ein paar Zeilen tiefer geschaut?
      ich gehe davon aus, wenn es keine ID mit den Namen existiert, dass es sich um ein HTMLK-Element handelt, was übergeben wurde

      <a href=":export-xxx.html" target="Main" onclick="setActive(this);">

      Und hier übergibst du gleich ein komplettes HTML-Elementobjekt. Das *kann* nicht funktionieren.
      Entweder du übergibst hier nur this.id, das wäre die weniger effiziente Lösung, oder du belässt es bei this, kannst dir dann aber innerhalb der Funktion die Verrenkungen mit getElementById() sparen - denn du hast dann bereits die komplett aufgelöste Referenz auf das Element.

      Das ist eigentlich so gewollt, da nur ein Link eine ID hat - alle anderen nicht
      Der Link mit der ID wird von ein anderen Frame aus gesetzt, deshalb rufe ich es per ID auf

      mfg
      Twilo

      1. Hi,

        offensichtlich erwartet deine Funktion als Parameter die ID eines HTML-Elements - also einen einfachen String.
        hast du auch noch ein paar Zeilen tiefer geschaut?

        ich muss zu meiner Schande gestehen: Nein, den Rest habe ich nur flüchtig überflogen. Sorry, dann sieht deine Funktion wieder korrekt aus - wenn auch recht ungewöhnlich.

        ich gehe davon aus, wenn es keine ID mit den Namen existiert, dass es sich um ein HTMLK-Element handelt, was übergeben wurde

        Gut. Dann bleibt nur aus Performancegründen zu kritisieren, dass du die relativ "teure" Funktion getElemetById, die ja das ganze DOM durchsucht, mehrfach mit demselben Argument aufrufst. Ein Aufruf, verbunden mit dem Speichern des Rückgabewerts in einer Variablen, wäre wohl günstiger.

        Entweder du übergibst hier nur this.id, das wäre die weniger effiziente Lösung, oder du belässt es bei this, kannst dir dann aber innerhalb der Funktion die Verrenkungen mit getElementById() sparen - denn du hast dann bereits die komplett aufgelöste Referenz auf das Element.

        Das ist eigentlich so gewollt, da nur ein Link eine ID hat - alle anderen nicht
        Der Link mit der ID wird von ein anderen Frame aus gesetzt, deshalb rufe ich es per ID auf

        Okay, dann bin ich aber auch mit meinem Latein am Ende.

        So long,
         Martin

        --
        Programmierer (m), seltener auch ~in (w):
        Irdische, i.a. humanoide Lebensform, die in einem komplizierten biochemischen Prozess Kaffee, Cola und Pizza in maschinenlesbaren Programmcode umwandelt.
        P~ bilden gelegentlich mit ihresgleichen kleine Gruppen, sogenannte Communities, sind aber ansonsten meist scheue Einzelgänger.
        P~ sind vorwiegend nachtaktiv und ohne technische Hilfsmittel nur eingeschränkt lebensfähig.
        1. Hallo,

          ich gehe davon aus, wenn es keine ID mit den Namen existiert, dass es sich um ein HTMLK-Element handelt, was übergeben wurde

          Gut. Dann bleibt nur aus Performancegründen zu kritisieren, dass du die relativ "teure" Funktion getElemetById, die ja das ganze DOM durchsucht, mehrfach mit demselben Argument aufrufst. Ein Aufruf, verbunden mit dem Speichern des Rückgabewerts in einer Variablen, wäre wohl günstiger.

          wie meinst du das?
          kann ich das Ergebnis in der if-Bedingung gleich zwischenspeichern?

          Gibt es eine Möglichkeit zu überprüfen, ob es sich ein Element (this) handelt?

          ich würde es gerne wie folgt überprüfen
          1. überprüfen ob es ein Element ist
          2. überprüfen ob es sich um eine ID handelt
          3. ansonsten nichts machen

          Entweder du übergibst hier nur this.id, das wäre die weniger effiziente Lösung, oder du belässt es bei this, kannst dir dann aber innerhalb der Funktion die Verrenkungen mit getElementById() sparen - denn du hast dann bereits die komplett aufgelöste Referenz auf das Element.

          mfg
          Twilo

          1. Hi,

            Ein Aufruf, verbunden mit dem Speichern des Rückgabewerts in einer Variablen, wäre wohl günstiger.
            wie meinst du das?
            kann ich das Ergebnis in der if-Bedingung gleich zwischenspeichern?

            Oder schon davor. Darf ich deine ursprüngliche Funktion mal etwas frisieren?

            function setActive(Element)
                { var el = document.getElementById(Element);
                  if (el)
                   { el.style.backgroundColor = colors[0];
                     el.style.color = colors[1];
                   }
                  else
                   { Element.style.backgroundColor = colors[0];
                     Element.style.color = colors[1];
                   }
                }

            Jetzt hast du bei gleicher Funktionalität nur noch einen Aufruf von getElementById(). Das alert() haeb ich jetzt unterschlagen, und den Funktionsnamen musst du noch ändern, wie du inzwischen weißt.

            Gibt es eine Möglichkeit zu überprüfen, ob es sich ein Element (this) handelt?

            Du meinst, ein gültiges HTML-Elementobjekt? Ich wüsste nicht, dass das geht.

            So long,
             Martin

            --
            F: Was macht ein Offizier, der in der Nase bohrt?
            A: Er holt das Letzte aus sich heraus.
            1. Hallo,

              Oder schon davor. Darf ich deine ursprüngliche Funktion mal etwas frisieren?

              klar, nur finde ich diese Klammersetzung schrecklich ;-)

              function setActive(Element)
                  { var el = document.getElementById(Element);
                    if (el)
                     { el.style.backgroundColor = colors[0];
                       el.style.color = colors[1];
                     }
                    else
                     { Element.style.backgroundColor = colors[0];
                       Element.style.color = colors[1];
                     }
                  }

              Jetzt hast du bei gleicher Funktionalität nur noch einen Aufruf von getElementById(). Das alert() haeb ich jetzt unterschlagen, und den Funktionsnamen musst du noch ändern, wie du inzwischen weißt.

              das alert war nur zur Kontrolle drin, ob die Funktion aufgerufen wird.

                  function setActive(Element){  
                      var id = document.getElementById(Element);  
                      if(id){  
                          Element = id;  
                      }  
                      Element.style.backgroundColor = colorValues[0];  
                      Element.style.color = colorValues[1];  
                  }
              

              gibt es dagegen etwas einzuwenden, außer den Funktionsnamen?

              Gibt es eine Möglichkeit zu überprüfen, ob es sich ein Element (this) handelt?

              Du meinst, ein gültiges HTML-Elementobjekt? Ich wüsste nicht, dass das geht.

              ja, bei selfhtml habe ich leider auch nichts gefunden

              mfg
              Twilo