jQuery

2009-07-23 11 views
6
ile bir DOM öğesini genişletme

Bir DOM öğesini, tümünü genişletmeden genişletmek istiyorum. Yani, kendi yöntemleri ve özellikleri ile özel bir sınıf istiyorum, ama aynı zamanda bir div olarak davranabilirim. Örneğin.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(); 

Bu mümkün mü?

cevap

5

DIV elemanı oluşturulan:

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

Bu da eklentileri genişletmek için harika çalışıyor, işlevleri geçersiz kılar, bu yüzden bu aslında aslında bu.fadeOut. Sınıfın içinde __proto__ kullanıyorum ve bunu temel jquery nesnesine aktarıyorum: [link] (http://pastebin.com/hFUnqTBQ) – Shanimal

0

jQuery yalnızca dizeleri ve öğeleri kabul ettiği için ekleme satırına ilettiğinizde bunu anlayamaz. MyClass'ınız muhtemelen öğenin kendisini tutmak için belirli bir anahtara sahip olacaktır (ör. This.el = document.createElement ("div");), ancak jQuery bunu kendi başına bulamaz.

+0

Anlaşılan, yukarıdakiler yapmak istediklerimin sadece bir örneğiydi. Özünde şu gibi bir şey arıyorum: MyClass: document.createElement ("div") Yani, belirli anahtarı bulmak için jquery söylemek istemiyorum, ancak nesnenin kendisi olduğunu düşünmek jquery var eleman, yani nesneyi öğeyi genişletir. – pondermatic

1

Yaptığınız gibi kendi nesnesini oluşturabilirsiniz. Daha sonra jQuery'nin elemanını genişletmek için extend method'u kullanabilirsiniz.

+0

Bu işe yaramazsa: "daha" fonksiyonu daha() { \t \t \t \t this.myname = \t \t \t} \t \t \t more.prototype.alert = function() { \t \t \t \t alert ('uyarısı!') \t \t \t} \t \t \t \t \t \t var div = $ (document .createElement ("div")); \t \t \t div.html ("this is s"); \t \t \t \t \t $.uzatmak (doğru, div, daha fazla); . \t \t \t \t \t \t $ (document) .ready (function() { \t \t \t \t $ ("body") (div) ekleyin; \t \t \t \t div.alert(); \t \t \t \t alert (div.myname); \t \t \t}); – pondermatic

+0

sağda, 'extend' yöntemiyle çalışmak için bir işlev değil, bir nesneye ihtiyacınız var. Uygun satırı şu şekilde değiştirin: '$ .extend (true, div, new more);' – geowa4

1

Öğeyi daha sonra almak istediğinizde sorun ortaya çıkacaktır. Belki de sadece böyle gibi elemanın veri olarak uzantılarını saklayabilirsiniz:

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

Sonra sonradan işlevleri çağırmak için, gibi bir şey yapacağını:

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

Ve bir argüman olarak div geçmektedir.

+0

Evet, bunun mümkün olduğu gibi bir şey olduğunun farkındayım, ama kesinlikle zarif değil. Javascript ile ilgili tüm hype için çok büyük, benim özel sınıf jQuery ördek gibi berbat yapamam gerçeği berbat. – pondermatic

1
Ayrıca bir eklenti olarak bunu yapabilir

: Herhangi element için Ardından

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); 
    }; 
}; 

: Eğer sınıf jquery çocuğuyum sınıfını yapabilir

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