Hallo,
Bei einem Projekt, bei dem das JS-Framework "jQuery" zum Einsatz kommt, möchte ich einem DOM-Element, nämlich einem Formular, eine selbstdefinierte Methode zuweisen.
Wenn ich mich recht erinnere und die nichts geändert haben, hat jQuery da eine recht merkwürdige Variante der Erweiterung: Man fügt Methoden, die man an DOM-Objekten sehen will in den Namensraum jQuery.fn.* ein.
~~~javascript
jQuery.fn.doSomesthing = function () {
alert("Yo!");
};
sorgt also dafür, dass $() ein Objekt zurückgibt, das mit doSomething() (und den jQuery-Methoden) erweitert wurde und man $("foo").doSomething() machen kann. Der gravierende Nachteil ist natürlich, dass diese Funktionen unabhängig vom Element-Typ vorhanden sind.
> $("form#foo").doSomething = function() {}
> In diesem Fall ist $("form#foo").doSomething zu einem späteren Zeitpunkt undefined.
Ohne nachgeforscht zu haben vermute ich einfach mal, dass das daran liegt, dass $() nicht die tatsächlichen DOM-Objekte zurückgibt, sondern ein Wrapperobjekt mit dem DOM-Element als Closure. Jedesmal, wenn Du $("form#foo") aufrufst, wird dieses Wrapperobjekt neu aus den DOM-Objekt und den jQuery.fn.\*-Funktionen zusammengebastelt – hat also nicht mehr die alte angefügte Funktion.
(Muss ja auch ein Wrapperobjekt sein, schließlich selektiert $("div.foo") mehrere DOM-Objekte, $() kann aber zum Zwecke der Chainability nur ein Objekt zurückgeben, auf dem dann Methoden ausgeführt werden.)
> Ich habe dazu aber in der Doku nichts gefunden.
Vielleicht helfen Dir diese Abschnitte:
• <http://docs.jquery.com/API/1.1.2/Core#.24.extend.28_prop_.29>
• <http://docs.jquery.com/Plugins/Authoring>
• <http://docs.jquery.com/Tutorials:Getting_Started_with_jQuery#Plug_me:_Writing_your_own_plugins>
Tim