2009-07-23 80 views
6

我想扩展DOM元素而不扩展所有元素。也就是说,我想用自己的方法和属性自定义类,但也可以把它作为一个div。例如。使用jQuery扩展DOM元素

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

这可能吗?

回答

5

你可以让你的类的子类的jQuery产生的DIV元素:

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'); 
0

当你将它传递给追加行时,jQuery将无法理解m,因为它只接受字符串和元素。你的MyClass可能有一个特定的键来保存元素本身(例如this.el = document.createElement(“div”);),但jQuery无法自己找到它。

+0

了解了,以上只是我想要做的一个例子。本质上我正在寻找类似于: MyClass:document.createElement(“div”) 也就是说,我不想告诉jquery查找特定键,但让jquery认为对象本身是元素,即我的对象扩展元素。 – pondermatic 2009-07-23 22:40:03

1

你可以制作你自己的物体,就像你在做什么。然后你可以使用jQuery的extend method来扩展元素。

+0

这是行不通的: 功能more(){ \t \t \t \t this.myname =“more!” \t \t \t} \t \t \t more.prototype.alert =函数(){ \t \t \t \t警报( '警报!') \t \t \t} \t \t \t \t \t \t VAR的div = $(文件.createElement( “DIV”)); \t \t \t div.html(“this is s”); \t \t \t \t \t \t $。扩展(true,div,more); 。 \t \t \t \t \t \t $(文件)。就绪(函数(){ \t \t \t \t $( “正文”)附加(DIV); \t \t \t \t div.alert(); \t \t \t \t alert(div.myname); \t \t \t}); – pondermatic 2009-07-23 22:48:12

+0

正确的,你需要一个对象,而不是一个函数来处理`extend`方法。用这个代替相应的行:`$ .extend(true,div,new more);` – geowa4 2009-07-24 01:07:21

1

当您想要稍后检索元素时会出现问题。也许你可以只存储扩展为元素的数据像这样:

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

然后在以后调用的函数,你会做这样的事情:

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

而且通过DIV作为参数。

+0

是的,我意识到这样的事情是可能的,但它绝对不是优雅的。对于所有关于javascript的宣传如此伟大,我无法让自定义类像jquery duck那样走路,这实际上很糟糕。 – pondermatic 2009-07-23 22:51:48

1

你也可以做它作为一个插件:

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

那么对于任何元素:

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