LeKuchen: Javascript (IE; FF) und Element Properties

Hallo zusammen,

ich bastele gerade an einem Stück Javascript rum und wie zu erwarten, interpretieren IE und FF den Code natürlich anders. Hier der wichtige Codeteil:

[code langg=javascript]
function validateCtrl(ctrlname) {
var vctrl;
vctrl = document.getElementById(ctrlname);
if (typeof(vctrl.evaluationfunction) == "string") {
            eval("vctrl.evaluationfunction = " + vctrl.evaluationfunction + ";");
        }
        ValidatorValidate(vctrl);
}
[/code]

Eine kurze Erklärung, was passieren soll: Bei der Control handelt es sich um ein div, welches ein Attribut evaluationfunction hat. Eine JS-Funktion mit dem Namen der evaluationfunction ist auch im JS Code vorhanden, sodass durch das eval (Umwandlung von String in Function) im späteren Verlauf des Codes diese Funktion gerufen werden kann.

Das Problem stellt sich aber vorher: Während der IE bei vctrl auf evaluationfunction als Property zugreifen kann, ist dies beim FF nur über getAttribute (bzw. setAtrtributeNS ?) möglich?

Stimmt das?

Gruss
LeKuchen

  1. Hallo,

    Eine kurze Erklärung, was passieren soll: Bei der Control handelt es sich um ein div, welches ein Attribut evaluationfunction hat. Eine JS-Funktion mit dem Namen der evaluationfunction ist auch im JS Code vorhanden, sodass durch das eval (Umwandlung von String in Function) im späteren Verlauf des Codes diese Funktion gerufen werden kann.

    Das Problem stellt sich aber vorher: Während der IE bei vctrl auf evaluationfunction als Property zugreifen kann, ist dies beim FF nur über getAttribute (bzw. setAtrtributeNS ?) möglich?

    Stimmt das?

    Wieso sollte getAttribute nötig sein? typeof(vctrl.evaluationfunction) sollte im Firefox undefined ergeben, aber keinen Fehler.

    Was eval("vctrl.evaluationfunction = " + vctrl.evaluationfunction + ";"); machen soll, verstehe ich nicht. Meintest du vielleicht eval("vctrl.evaluationfunction = " + evaluationfunction + ";")? So verstehe ich zumindest deine Aufgabenbeschreibung. Das kannst du einfacher schreiben: vctrl.evaluationfunction = evaluationfunction; Dabei ist evaluationfunction eine globale Funktion (»Eine JS-Funktion mit dem Namen der evaluationfunction ist auch im JS Code vorhanden«), auf die du einfach über ihren Namen verweist. Dass der eval()-Aufruf ein Fehler erzeugt, wenn vctrl.evaluationfunction undefined ist, kann sein.

    Mathias

    1. Hallo,

      typeof(vctrl.evaluationfunction) sollte im Firefox undefined ergeben, aber keinen Fehler.

      Okok, keinen Fehler sondern undefined, hast Recht. Aber ich möchte natürlich an den String von der vctrl die so aussieht:

      <div evaluationfunction="RegExValidator"> </div>

      Was eval("vctrl.evaluationfunction = " + vctrl.evaluationfunction + ";"); machen soll, verstehe ich nicht. Meintest du vielleicht eval("vctrl.evaluationfunction = " + evaluationfunction + ";")? So verstehe ich zumindest deine Aufgabenbeschreibung. Das kannst du einfacher schreiben: vctrl.evaluationfunction = evaluationfunction;

      Durch das eval wird der Stringwert von evaluationfunction aus der Property der vctrl in eine Funktion gewandelt. Ich reiche die Control dann weiter und habe somit als Property die Funktion verfügbar. Die evalutaionfunction wird dynamisch aus der Control selber zugewiesen. Was ist  daran schwer zu verstehen?

      Also zurück zur Frage: Warum liefert FF für vctrl.evaluationfunction undefined, während IE den String-Wert zurückgibt?

      Gruss
      LeKuchen

      1. hi,

        <div evaluationfunction="RegExValidator"> </div>

        Ein derartiges HTML-Attribut existiert nicht.

        Also zurück zur Frage: Warum liefert FF für vctrl.evaluationfunction undefined,

        Siehe oben.

        während IE den String-Wert zurückgibt?

        Zu seltsamem Verhalten des IE stellst du hier wirklich noch Fragen ...?

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. function validateCtrl(ctrlname) {
    var vctrl;
    vctrl = document.getElementById(ctrlname);
    if (typeof(vctrl.evaluationfunction) == "string") {
                eval("vctrl.evaluationfunction = " + vctrl.evaluationfunction + ";");
            }
            ValidatorValidate(vctrl);
    }

      
    Was soll das eval den machen?  
      
    Du kannst sowohl im IE als auch im FF auch ohne die Funktionen set/getAttribute() auf die Attribute zugreifen.  
      
    Struppi.
    
    -- 
    [Javascript ist toll](http://javascript.jstruebig.de/)
    
    1. Hallo,

      Was soll das eval den machen?

      Das Eval wandelt den String des Funktionsnamens in eine Funktion um.

      Du kannst sowohl im IE als auch im FF auch ohne die Funktionen set/getAttribute() auf die Attribute zugreifen.

      wenn ich im FF auf vctrl.evaluationfunction zugreife, gibt er mir undefined zurück, wobei vctrl wie folgt aussieht:

      <div evaluationfunction="DataTypeValidator"></div>

      Beim IE gibt er "DataTypeValidator" als String zurück....in der typeof-Abfrage wird dann der String DataTypeValidator per eval in die Function DataTypeValidator gewandelt.

      Gruss,
      LeKuchen

      1. Was soll das eval den machen?

        Das Eval wandelt den String des Funktionsnamens in eine Funktion um.

        Dann ist eval überflüssig.

        function test()
        {
        alert('Hallo');
        }

        var func = 'test';
        windowfunc;

        Du kannst sowohl im IE als auch im FF auch ohne die Funktionen set/getAttribute() auf die Attribute zugreifen.

        wenn ich im FF auf vctrl.evaluationfunction zugreife, gibt er mir undefined zurück, wobei vctrl wie folgt aussieht:

        <div evaluationfunction="DataTypeValidator"></div>

        Das ist etwas anderes, du versuchst auf ein nicht definiertes HTML Attribut zu zugreifen. Ich weiß nicht ob das geht.

        Struppi.

      2. Hallo! :-)

        <div evaluationfunction="DataTypeValidator"></div>

        Da das ein leeres <div>-Tag ist, würd erst mal damit anfangen das <div>-Tag html konform zu machen:

        <div id="evaluationfunction" style="visibility:hidden;">DataTypeValidator</div>

        Durch den style="visibility:hidden;" wird es nicht angezeigt.
        Auf den Inhalt greifst Du dann über das Attribut ".innerHTML" zu.
        Das verstehen sowohl FF als auch IE.

        Das Eval ist auch ein wenig seltsam, weil es macht nichts anderes, als ein Semikolon anzuhängen.
        Original:

        eval("vctrl.evaluationfunction = " + vctrl.evaluationfunction + ";");

        Das heisst ja nix anderes, als:
        vctrl.evaluationfunction = "DataTypeValidator" + ";"

        Geht auch so:
        vctrl.evaluationfunction.value += ";";

        Auf meine Methode übersetzt wäre das dann:
        vctrl.innerHTML += ";";

        Also alles zusammen:
        vctrl = document.getElementById(ctrlname);
        if (typeof(vctrl.innerHTML) == "string") {
                    vctrl.innerHTML += ";";
                }

        Die Eigenschaft .innerText kann der FF leider nicht, daher aufpassen, dass sich keine HTML-Tags innerhalb dieses <div></div> befinden

        Andy

  3. Tag LeKuchen.

    Eine kurze Erklärung, was passieren soll: Bei der Control handelt es sich um ein div, welches ein Attribut evaluationfunction hat.

    Da dieses Attribut nicht zum DOM-Standard gehört, steht es dir als Objekteigenschaft auch nicht zur Verfügung. Der IE scheint mir da fehlertoleranter. Folgendes funktioniert jedenfalls im IE 6 und im FF 1.0.7:

    Ctrl = new Object();  
      
    function dyna_func(ident) {  
      var obj = document.getElementById(ident);  
      for(i=0;i<obj.attributes.length;i++) {  
        if(obj.attributes[i].nodeName == "evaluationfunction")  
          Ctrl.evaluationfunction = obj.attributes[i].nodeValue;  
      }  
    }
    

    Du könntest dir jetzt noch eine eigenes Control-Objekt stricken, das könnte so aussehen:

    Ctrl = new Object();  
    test_func = "{ alert('Test bestanden'); }";  
      
    function dyna_func(ident) {  
      var obj = document.getElementById(ident);  
      for(i=0;i<obj.attributes.length;i++) {  
        if(obj.attributes[i].nodeName == "evaluationfunction")  
          Ctrl.evaluationfunction = new Function(window[obj.attributes[i].nodeValue]);  
      }  
      // Testaufruf  
      Ctrl.evaluationfunction();  
    }
    

    In der Hoffnung, dich richtig verstanden zu haben.

    Siechfred