bene: Javascript entfernen per DOM

Hallo zusammen,

ich habe ein JavaScript im Dokument

z.B.

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

Dann füge ich per JavaScript einen neuen Script Knoten ein, der mit die aktuelle Test-Funktion "überschreibt".

z.B.

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

Der DOM-Inspektor zeigt mir, dass die Funktion prinzipiell nicht überschrieben wird - sondern nur ein weiterer Skript Knoten mit derselben Funktion angefügt wurde.
Da diese aber dem Skript-Stack später hinzugefügt wurde, wird von allen gängigen Browsern diese "neu" Funktion angesprochen und ausgeführt.

Ich möchte nun die "neu" Funktion wieder aus dem DOM entfernen, so dass  die ursprüngliche "default" Funktion wieder verwendet wird.

Dies funktioniert auch einwandfrei - der DOM-Inspektor zeigt mir den zuvor hinzugefügten Knoten nicht mehr an.

---

Wenn ich nun aber wieder die Funktion test() ausführe, wird immer noch die Logik der "neu" Funktion ausgeführt, obwohl diese nicht mehr im DOM vorhanden ist.

Nun meine Fragen:

1. Weis jemand, wie ich meine zweite Funktion wieder vollständig entfernen kann? So dass die erste Funktion wieder greift?

2. Helfen würde mir auch, wenn es eine Möglichkeit gibt, auszuwählen, welche Version einer Funktion aufgerufen wird. Geht das?

3. Kennt jemand eine Möglichkeit, einen Script Knoten eindeutig zu indentifizieren und auszuwählen - also nicht über getElementsByTagName?

4. Gibt es eine möglichkeit, bestehende Funktionsnamen zu manipulieren. Also z.B. aus "test()" die Funktion "test_alt()" zu machen?

Prinzipiell, würde mir schon eine Lösung auf eine der Fragen reichen, aber haltet euch nicht zurück wenn Ihr mehr wisst ;-)

Grüße,
Bene

  1. Hi,

    Der DOM-Inspektor zeigt mir, dass die Funktion prinzipiell nicht überschrieben wird

    falsch. Der DOM-Inspector zeigt Dir DOM-Objekte, keine Funktionen.

    Ich möchte nun die "neu" Funktion wieder aus dem DOM entfernen,

    Die Funktion liegt nicht im DOM-Baum, sondern im window-Objekt. Und da ist die alte Funktion nicht mehr existent, sie wurde dereferenziert.

    so dass  die ursprüngliche "default" Funktion wieder verwendet wird.

    Dann muss eine Referenz auf die alte Funktion bestehen. Stelle diese also vor dem Erzeugen der neuen Funktion her.

    Wenn ich nun aber wieder die Funktion test() ausführe, wird immer noch die Logik der "neu" Funktion ausgeführt, obwohl diese nicht mehr im DOM vorhanden ist.

    Der DOM-Baum ist bei der Angelegenheit vollkommen irrelevant. Funktionen stecken nach wie vor im window-Objekt.

    1. Kennt jemand eine Möglichkeit, einen Script Knoten eindeutig zu indentifizieren und auszuwählen - also nicht über getElementsByTagName?

    Welche Information identifiziert den Knoten denn eindeutig?

    1. Gibt es eine möglichkeit, bestehende Funktionsnamen zu manipulieren. Also z.B. aus "test()" die Funktion "test_alt()" zu machen?

    Jein. Die Funktion heißt nicht "test()", sondern "test", was eigentlich auch nur eine Eigenschaft des window-Objekts (also "eine Variable") ist.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
      1. Kennt jemand eine Möglichkeit, einen Script Knoten eindeutig zu indentifizieren und auszuwählen - also nicht über getElementsByTagName?

      Welche Information identifiziert den Knoten denn eindeutig?

      Ja? Ist das offensichtlich? Stille mein Neugier bitte ;-)
      Im DOM stehen hier nur eine unmenge an Skript-Knoten, keine besitzt eine ID oder ähnliches mit der ein Knoten direkt ansprechbar wäre.

      1. Gibt es eine möglichkeit, bestehende Funktionsnamen zu manipulieren. Also z.B. aus "test()" die Funktion "test_alt()" zu machen?

      Jein. Die Funktion heißt nicht "test()", sondern "test", was eigentlich auch nur eine Eigenschaft des window-Objekts (also "eine Variable") ist.

      Das fällt leider aus, weil die Standard Funktion sozusagen "normal" verwendbar sein soll.
      Sprich, ich möchte einen späteren Nutzer, der diese oder andere Funktionen in seinem Skript nutzt, nicht dazu zwingen für jede Mehtode eine Variable anzugeben, die ich wiederum manipulieren kann.
      Wäre auch zu Fehleranfällig.

      Cheatah

      1. n'abend,

        Ja? Ist das offensichtlich? Stille mein Neugier bitte ;-)
        Im DOM stehen hier nur eine unmenge an Skript-Knoten, keine besitzt eine ID oder ähnliches mit der ein Knoten direkt ansprechbar wäre.

        ein Blick in die Attributliste des Script-Elements könnte da aufschlussreich sein ;)

        weiterhin schönen abend...

        --
        Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
        sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
  2. hi,

    ich habe ein JavaScript im Dokument
    z.B.
    function test() { alert('test default'); }

    Dann füge ich per JavaScript einen neuen Script Knoten ein, der mit die aktuelle Test-Funktion "überschreibt".

    z.B.
    function test() { alert('test neu'); }

    Der DOM-Inspektor zeigt mir, dass die Funktion prinzipiell nicht überschrieben wird - sondern nur ein weiterer Skript Knoten mit derselben Funktion angefügt wurde.

    Unterscheide bitte zwischen HTML-Elementen, und Javascript-Objekten.

    Du hast ein neues HTML-Element script erstellt.
    Dessen Inhalt wird interpretiert, die Funktion test überschrieben.

    Da diese aber dem Skript-Stack später hinzugefügt wurde, wird von allen gängigen Browsern diese "neu" Funktion angesprochen und ausgeführt.

    Ich möchte nun die "neu" Funktion wieder aus dem DOM entfernen, so dass  die ursprüngliche "default" Funktion wieder verwendet wird.

    Dies funktioniert auch einwandfrei - der DOM-Inspektor zeigt mir den zuvor hinzugefügten Knoten nicht mehr an.

    Jetzt hast du das HTML-Element script aus dem DOM entfernt.
    Das bewrikt aber keine Zeitreise, nach der der bereits interpretierte Inhalt dieses Elements wieder weg wäre.

    Wenn ich nun aber wieder die Funktion test() ausführe, wird immer noch die Logik der "neu" Funktion ausgeführt, obwohl diese nicht mehr im DOM vorhanden ist.

    Das HTML-Element script ist nicht mehr im DOM.
    Das Javascript-Funktionsobjekt test hat damit aber nichts weiter zu tun.

    1. Weis jemand, wie ich meine zweite Funktion wieder vollständig entfernen kann? So dass die erste Funktion wieder greift?

    Das geht nur, wenn du dir die ursprüngliche Funktion vorher sicherst.

    var alteFunktion = function() { test() ; };

    1. Helfen würde mir auch, wenn es eine Möglichkeit gibt, auszuwählen, welche Version einer Funktion aufgerufen wird. Geht das?

    Nur, wenn du dir selbst eine Versionierung schaffst.

    1. Kennt jemand eine Möglichkeit, einen Script Knoten eindeutig zu indentifizieren und auszuwählen - also nicht über getElementsByTagName?

    Script hat kein ID-Attribut.
    Andere Möglichkeiten des Zugriffs stehen dir ggf. offen, z.B. könnte Script das firstChild des head sein, je nachdem wo du es einfügst - etc., pp.

    1. Gibt es eine möglichkeit, bestehende Funktionsnamen zu manipulieren. Also z.B. aus "test()" die Funktion "test_alt()" zu machen?

    Du kannst es machen wie oben beschrieben, dir die Funktion "kopieren". Die ursprüngliche Funktionsreferenz besteht dann natürlich weiterhin, so lange du nichts anderes mit ihr anstellst.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. hi,

      ich habe ein JavaScript im Dokument
      z.B.
      function test() { alert('test default'); }

      Dann füge ich per JavaScript einen neuen Script Knoten ein, der mit die aktuelle Test-Funktion "überschreibt".

      z.B.
      function test() { alert('test neu'); }

      Der DOM-Inspektor zeigt mir, dass die Funktion prinzipiell nicht überschrieben wird - sondern nur ein weiterer Skript Knoten mit derselben Funktion angefügt wurde.

      Unterscheide bitte zwischen HTML-Elementen, und Javascript-Objekten.

      Du hast ein neues HTML-Element script erstellt.
      Dessen Inhalt wird interpretiert, die Funktion test überschrieben.

      Ok, ich dachte es gibt hier wirklich so etwas wie einen "Funktions-Stack", bei dem die neueste Funktion verwendet wird - schade wäre ja sonst auch zu einfach gewesen...

      Jetzt hast du das HTML-Element script aus dem DOM entfernt.
      Das bewrikt aber keine Zeitreise, nach der der bereits interpretierte Inhalt dieses Elements wieder weg wäre.

      wie gesagt, wäre ja auch zu einfach gewesen ;-)

      1. Weis jemand, wie ich meine zweite Funktion wieder vollständig entfernen kann? So dass die erste Funktion wieder greift?

      Das geht nur, wenn du dir die ursprüngliche Funktion vorher sicherst.

      var alteFunktion = function() { test() ; };

      Ok, dass könnte funktionieren - ich berichte ob es klappt.

      Thx, Bene

      1. var alteFunktion = function() { test() ; };

        Ok, dass könnte funktionieren - ich berichte ob es klappt.

        Thx, Bene

        Habe nun einiges ausprobiert - leider noch kein verwertbares Ergebnis.

        Problem:

        Kann bei der Zuweisung der Funktion keine Variable übergeben werden?

        Also z.B.:

        var funktionsName = "test()";
        var alteFunktion = function() { funktionsName; };

        Wenn ich mir "alteFunktion" über ein alert ausgeben lasse steht dort
        "function() { funktionsName; };

        ----

        Da das schonmal nicht ging habe ich versucht die Funktion erstmal direkt einzugeben.

        var alteFunktion = function() { test(); };

        Wie rufe ich jetzt aber "alteFunktion" auf?

        alteFunktion(); oder window.setTimeout("' + alteFunktion + '()", 0);

        zeigen keine Wirkung!?

        ---

        Wie sieht es bei Funktionen mit Parametern aus? Kann ich diese genauso "kopieren" oder muss hier der "function()" Befehl auch die Parmeter enthalten?

        Gruß,
        Bene

    2. Hallo,

      Script hat kein ID-Attribut.

      ... was man einfach ignorieren sollte.

      (In XHTML ist ein id-Attribut bei script übrigens erlaubt. Ich sehe das eher als Fehler in HTML 4.01.)

      Mathias

  3. Habe die Referenz Geschichte mal im kleinen getestet - Aufrufe funktionieren, jedoch wird die alte Funktion trotzdem überschrieben.

    Die zuvor erstellte Referenz bleibt wirkungslos.

    <html>
    <head>
    <title></title>
    <script language="javascript" text="text/javascript">

    function start() {

    var functionVar = function(bla) { test(bla); };

    functionVar('alt');

    /* add js */
      var javaScript   = document.createElement('script');
      javaScript.language = "JavaScript";
      javaScript.type  = "text/javascript";
      javaScript.text     = 'function test(bla) { alert('testneu: ' + bla); }';
      document.getElementsByTagName('head')[0].appendChild(javaScript);

    test('neu');
      functionVar('alt');
     }

    function test(bla) {
      alert('testalt: ' + bla);
     }

    </script>
    <body onload="start()">
    </body>
    </html>

    1. <script language="javascript" text="text/javascript">

      Das language Attribut ist mittlerweile überflüssig.

      function start() {

      var functionVar = function(bla) { test(bla); };

      functionVar('alt');

      Damit erzeugst du nur eine neue Funktion, die test() aufruft, du willst eigentlich:

      var functionVar = test;
      functionVar('alt');

      Struppi.

      --
      Javascript ist toll (Perl auch!)
      1. <script language="javascript" text="text/javascript">

        Das language Attribut ist mittlerweile überflüssig.

        function start() {

        var functionVar = function(bla) { test(bla); };

        functionVar('alt');

        Damit erzeugst du nur eine neue Funktion, die test() aufruft, du willst eigentlich:

        var functionVar = test;
        functionVar('alt');

        Struppi.

        Ja, aber mit "var functionVar = test;" bekomme ich keine Kopie der Funktion.

        Ich starte mal ein neues Thema, vllt weis jemand bescheid.

        1. Ja, aber mit "var functionVar = test;" bekomme ich keine Kopie der Funktion.

          Doch, hast du's ausprobiert.

          Ich starte mal ein neues Thema, vllt weis jemand bescheid.

          Mach's nicht der wird gelöscht.

          Struppi.

          --
          Javascript ist toll (Perl auch!)
          1. Ja, aber mit "var functionVar = test;" bekomme ich keine Kopie der Funktion.

            Doch, hast du's ausprobiert.

            Ich starte mal ein neues Thema, vllt weis jemand bescheid.

            Mach's nicht der wird gelöscht.

            Struppi.

            Ja sicher, habs getestet ... mom.

            So grade nochmal getestet nun funktionierts - vllt war noch was falsches im Cache vorhin.

            Thx,
            Bene