2009-07-23 14 views
6

Me gustaría extender un elemento DOM sin extender todos ellos. Es decir, me gustaría una clase personalizada con sus propios métodos y propiedades, pero también poder tratarla como un div. P.ej.Extendiendo un elemento DOM con 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(); 

¿Esto es posible?

Respuesta

5

Usted puede hacer su clase de una clase hija de la jQuery generada DIV elemento:

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

Esto funciona muy bien para extender complementos también, anulando funciones para que this.hide sea realmente this.fadeOut. Yo uso __proto__ dentro de la clase y le paso el objeto base jquery como este: [link] (http://pastebin.com/hFUnqTBQ) – Shanimal

0

jQuery no podrá entender m cuando lo pase a la línea de anexión, ya que solo acepta cadenas y elementos. Su MyClass probablemente tendrá una clave específica para contener el elemento en sí (por ejemplo, this.el = document.createElement ("div");), pero jQuery no podrá encontrarlo por sí mismo.

+0

Entendido, lo anterior fue solo un ejemplo de lo que estaba buscando hacer. En esencia, estoy buscando algo como: MyClass: document.createElement ("div") Es decir, no quiero decirle a jquery que encuentre la clave específica, pero creo que el objeto en sí es el elemento, es decir, mi objeto extiende el elemento. – pondermatic

1

Podrías hacer tu propio objeto, como lo estás haciendo. Luego puede usar jQuery's extend method para extender el elemento.

+0

Esto no funciona: "más" función más() { \t \t \t \t this.myname = \t \t \t} \t \t \t more.prototype.alert = function() { \t \t \t \t alert ('alerta!') \t \t \t} \t \t \t \t \t \t var div = $ (documento .createElement ("div")); \t \t \t div.html ("this is s"); \t \t \t \t \t \t $.extender (verdadero, div, más); . \t \t \t \t \t \t $ (document) ready (function() { \t \t \t \t $ ("cuerpo") append (div); \t \t \t \t div.alert(); \t \t \t \t alert (div.myname); \t \t \t}); – pondermatic

+0

a la derecha, necesita un objeto, no una función para que funcione con el método 'extender'. reemplace la línea apropiada con esto: '$ .extend (true, div, new more);' – geowa4

1

El problema vendrá cuando desee recuperar el elemento más adelante. Tal vez lo que puede almacenar las extensiones como datos del elemento, como por ejemplo:

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

A continuación, llamar a las funciones más tarde, se haría algo como:

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

y pasar el div como un argumento.

+0

Sí, me doy cuenta de que algo como esto es posible, pero ciertamente no es elegante. A pesar de todo el alboroto sobre javascript es tan bueno, el hecho de que no puedo hacer que mi clase personalizada camine como un pato jquery es una mierda. – pondermatic

1

También puede hacerlo como un 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); 
    }; 
}; 

Entonces, para cualquier elemento:

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