2009-07-23 18 views
6

Ich möchte ein DOM-Element erweitern, ohne sie alle zu erweitern. Das heißt, ich möchte eine benutzerdefinierte Klasse mit eigenen Methoden und Eigenschaften, aber auch in der Lage sein, sie als div zu behandeln. Z.B.Erweitern eines DOM-Elements mit jQuery

MyClass = function(){ 
    this.foo = "waaa"; 
} 
MyClass.prototype.changeText = function(newtext){ 
    // if this extended $(document.createElement("div")) something 
    // like this might be possible 
    this.html(newtext); 
} 
MyClass.prototype.alertFoo = function(){ 
    alert(this.foo); 
} 

var m = new MyClass(); 
$("body").append(m); 
m.changetext(); 

Ist das möglich?

Antwort

5

Sie können Ihre Klasse ein Kind Klasse des jquery erzeugt DIV-Element machen:

function MyClass(){ 
    this.foo = "waaa"; 
} 
MyClass.prototype = $('<div/>'); 
MyClass.prototype.changeText = function(newtext){ 
    this.html(newtext); 
} 
MyClass.prototype.alertFoo = function(){ 
    alert(this.foo); 
} 

var m = new MyClass(); 
$("body").append(m); 
m.changeText('appletree'); 
+1

Dies funktioniert auch hervorragend zum Erweitern von Plugins, die Funktionen überschreiben, so dass this.hide eigentlich this.fadeOut ist. Ich benutze __proto__ innerhalb der Klasse und übergebe es das Basis-jquery-Objekt wie folgt: [link] (http://pastebin.com/hFUnqTBQ) – Shanimal

0

jQuery kann m nicht verstehen, wenn Sie es an die Append-Zeile übergeben, da es nur Zeichenfolgen und Elemente akzeptiert. Ihre MyClass wird wahrscheinlich einen bestimmten Schlüssel haben, der das Element selbst enthält (z. B. this.el = document.createElement ("div");), aber jQuery kann das nicht selbst finden.

+0

Verstanden, das obige war nur ein Beispiel für das, was ich tun wollte. Im Wesentlichen bin ich auf der Suche nach etwas wie: MyClass: document.createElement ("div") Das heißt, ich möchte nicht jquery sagen, um den spezifischen Schlüssel zu finden, aber jquery denke, dass das Objekt selbst ist Element, dh mein Objekt erweitert das Element. – pondermatic

1

Sie könnten Ihr eigenes Objekt erstellen, so wie Sie es tun. Dann können Sie jQuerys extend method verwenden, um das Element zu erweitern.

+0

Dies funktioniert nicht: "mehr" Funktion mehr() { \t \t \t \t this.myname = \t \t \t} \t \t \t more.prototype.alert = function() { \t \t \t \t alert ('Alarm') \t \t \t} \t \t \t \t \t \t var div = $ (document .createElement ("div")); \t \t \t div.html ("das ist s"); \t \t \t \t \t \t $.verlängern (wahr, div, mehr); . \t \t \t \t \t \t $ (document) .ready (function() { \t \t \t \t $ ("body") anhängen (div); \t \t \t \t div.alert(); \t \t \t \t Alarm (div.Myname); \t \t \t}); – pondermatic

+0

richtig, Sie brauchen ein Objekt, keine Funktion, um mit der 'extend' Methode zu arbeiten. ersetze die entsprechende Zeile mit: '$ .extend (true, div, new more);' – geowa4

1

Das Problem tritt auf, wenn Sie das Element später abrufen möchten. Vielleicht können Sie speichern nur die Erweiterungen wie Daten des Elements wie solche:

var new_div = $('<div id="new_div" />'); 
new_div.data('m', new MyClass()); 

Dann später die Funktionen aufrufen, würden Sie so etwas wie:

new_div.data('m').changetext(new_div) 

Und das div als Argument übergeben.

+0

Ja, mir ist klar, dass sowas möglich ist, aber es ist definitiv nicht elegant. Für den ganzen Hype über Javascript, das so groß ist, ist die Tatsache, dass ich meine benutzerdefinierte Klasse nicht wie eine jQuery-Ente laufen lassen kann, irgendwie scheiße. – pondermatic

1

Sie können auch tun es als Plugin:

jQuery.fn.myKindOfElement = function(msg) { 
    var foo = msg; // foo is basically a private member 
    this.alertFoo = function() { 
     alert(foo); 
    }; 
    this.setFoo = function(msg) { 
     foo = msg; 
    }; 
    this.changeText = function(text) { 
     // doesn't make sense because html already exists here 
     this.html(text); 
    }; 
}; 

Dann gilt für jedes Element:

var myKind = $('<div/>').myKindOfElement('bar'); 
$('body').append(myKind); 
myKind.alertFoo(); // alerts 'bar' 
myKind.changeText('blah'); // same as myKind.html('blah')