Christian: document.getElementById() überschreiben

Hi,

ich möchte die Methode document.getElementById überschreiben. Die neue Methode soll das Objekt mit der ID zurückgeben (wie gehabt) und zusätzlich weitere Dinge machen.

Habe folgendes versucht:

document.getElementById = function(id)
{
   // mache was...

return document.getElementById(id);
}

Jedes mal wenn man dann diese Methode aufgerufen wird, soll zusätzlich irgendwas gemacht werden und dann ganz normal das entsprechende Objekt zurückgegegeben werden.

Problem ist: Es ist eine rekursive Methode und sie ruft sich jedesmal wieder neu auf!

Hat jemand ne Idee, wie ich das machen kann?

würde ich
return document.all[id]
ging es im IE, aber das soll natürlich überall gehen!

Gruß
Christian

  1. Moin,

    Problem ist: Es ist eine rekursive Methode und sie ruft sich jedesmal wieder neu auf!

    Also wenn das funktioniert (das geht wirklich?), dann sollte doch auch bla = document.getElementById; document.getElementById = function(id) { ... return bla(id); } tun. Aber kannst du dein Problem nicht eleganter lösen?

    --
    Henryk Plötz
    Grüße aus Berlin
    ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
    ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~
  2. Hallo,

    ich möchte die Methode document.getElementById überschreiben. Die neue Methode soll das Objekt mit der ID zurückgeben (wie gehabt) und zusätzlich weitere Dinge machen.
    Habe folgendes versucht:
    document.getElementById = function(id)
    {
       // mache was...

    return document.getElementById(id);
    }
    Jedes mal wenn man dann diese Methode aufgerufen wird, soll zusätzlich irgendwas gemacht werden und dann ganz normal das entsprechende Objekt zurückgegegeben werden.
    Problem ist: Es ist eine rekursive Methode und sie ruft sich jedesmal wieder neu auf!

    Klar, das. Die Anweisung return document.getElementById(id) ruft document.getElementById(id) auf. ;-))

    Du hast das Prinzip der OOP nicht richtig verstanden. Methoden sind keine eigenständigen Objekte. Methoden _gehören_ zu Objekten. Überschreiben kann man nur Methoden der Super-Klasse. Mit anderen Worten: Das Überschreiben von Methoden funktioniert nur in einer Klasse, die eine andere Klasse erweitert und damit beerbt. Du musst also die Klasse "document" erweitern und in der Klassenbeschreibung dieser erweiterten Klasse die Methode überschreiben.

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
            "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    <head>
    <title>MyDocument extends document</title>
    <script type="text/javascript">
    <!--
    function MyDocument() {
      this.prototype = document;
      this.getElementById = function(id) {
        alert("Hier bin ich erweitert.");
        var iElem = this.prototype.getElementById(id);
        return iElem;
      };
      this.writeln = function(str) {
        this.prototype.writeln(str);
      };
    }
    //-->
    </script>
    </head>
    <body>
    <h1 id="UE1">Überschrift</h1>
    <p id="TA1">Textabsatz</p>
    <script type="text/javascript">
    <!--
    myD = new MyDocument();
    //Nutzen der erweiterten Methode
    alert(myD.getElementById("TA1").firstChild.nodeValue);
    //Nutzen einer ererbten Methode
    myD.writeln("Hallo <b><i>Welt</i></b>");
    //-->
    </script>
    </body>
    </html>

    Wie Du siehst, funktioniert die Vererbung bei JavaScript nicht immer automatisch. Das geht nur, wenn ein selbst erstellter Prototyp einen anderen selbst erstellten Prototyp erweitert. Hier muss die Methode writeln explizit "geerbt" werden.

    viele Grüße

    Axel