Mr. Horse: jQuery: DOM-Objekte um eigene Methoden erweitern

Hallo,

nach langer Abstinenz mal wieder hier - und sofort schmarotzerhaft mit einer Frage... ;)

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.
Mit "normalem" Javascript wäre das recht einfach:
var myForm = document.forms['foo'];
myForm.doSomething = function() { alert('yo'); }

Im jQuery-Kontext bzw. mit einem jQuery-Objekt geht das so nicht:
$("form#foo").doSomething = function() {}

In diesem Fall ist $("form#foo").doSomething zu einem späteren Zeitpunkt undefined.

Ich habe dazu aber in der Doku nichts gefunden. Die Methode bind() hilft mir nicht weiter, denn meine Methode soll ja nicht an einen Event gebunden sein.

Hat jemand von Euch einen Tipp für mich?

Thanx,
Mr. Horse

--
No, Sir, I don't like it.
  1. 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