2009-07-23 36 views
6

Tôi muốn mở rộng một phần tử DOM mà không mở rộng tất cả chúng. Đó là, tôi muốn một lớp tùy chỉnh với các phương thức và thuộc tính riêng của nó, nhưng cũng có thể coi nó là một div. Ví dụ.Mở rộng một phần tử DOM với 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(); 

Điều này có khả thi không?

Trả lời

5

Bạn có thể làm cho lớp học của bạn một lớp con của jquery tạo DIV yếu tố:

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

Điều này cũng rất hữu ích cho việc mở rộng các plugin, ghi đè các hàm để this.hide thực sự là this.fadeOut. Tôi sử dụng __proto__ bên trong lớp và vượt qua nó đối tượng jquery cơ sở như thế này: [link] (http://pastebin.com/hFUnqTBQ) – Shanimal

0

jQuery sẽ không thể hiểu được m khi bạn chuyển nó vào dòng chắp thêm, bởi vì nó chỉ chấp nhận chuỗi và phần tử. MyClass của bạn có thể sẽ có một khóa cụ thể để giữ chính phần tử đó (ví dụ: this.el = document.createElement ("div");), nhưng jQuery sẽ không thể tự tìm thấy phần tử đó.

+0

Đã hiểu, ở trên chỉ là một ví dụ về những gì tôi đang tìm kiếm. Về bản chất tôi đang tìm một cái gì đó như: MyClass: document.createElement ("div") Đó là, tôi không muốn nói jquery để tìm khóa cụ thể, nhưng có jquery nghĩ rằng đối tượng chính nó là phần tử, tức là đối tượng của tôi mở rộng phần tử. – pondermatic

1

Bạn có thể tạo đối tượng của riêng mình, giống như bạn đang làm. Sau đó, bạn có thể sử dụng jQuery extend method để mở rộng phần tử.

+0

Tính năng này không hoạt động: chức năng khác() { \t \t \t \t this.myname = "more!" \t \t \t} \t \t \t more.prototype.alert = function() { \t \t \t \t alert ('cảnh báo!') \t \t \t} \t \t \t \t \t \t var div = $ (document .createElement ("div")); \t \t \t div.html ("đây là s"); \t \t \t \t \t \t $.mở rộng (true, div, more); . \t \t \t \t \t \t $ (document) .ready (function() { \t \t \t \t $ ("cơ thể") append (div); \t \t \t \t div.alert(); \t \t \t \t cảnh báo (div.myname); \t \t \t}); – pondermatic

+0

bên phải, bạn cần một đối tượng, không phải là một hàm để nó hoạt động với phương thức 'extend'. thay thế các dòng thích hợp với điều này: '$ .extend (true, div, new more);' – geowa4

1

Sự cố sẽ đến khi bạn muốn truy xuất phần tử sau này. Có lẽ bạn chỉ có thể lưu trữ các phần mở rộng như dữ liệu của nguyên tố này giống như ví dụ:

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

Sau đó, để gọi các chức năng sau đó, bạn sẽ làm điều gì đó như:

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

Và vượt qua div như một cuộc tranh cãi.

+0

Vâng, tôi nhận ra một cái gì đó như thế này là có thể, nhưng nó chắc chắn không thanh lịch. Đối với tất cả các hype về javascript là tuyệt vời như vậy, thực tế là tôi không thể làm cho lớp học tùy chỉnh của tôi đi bộ như một con vịt jquery kinda sucks. – pondermatic

1

Bạn cũng có thể làm điều đó như là một 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); 
    }; 
}; 

Sau đó cho bất kỳ yếu tố:

var myKind = $('<div/>').myKindOfElement('bar'); 
$('body').append(myKind); 
myKind.alertFoo(); // alerts 'bar' 
myKind.changeText('blah'); // same as myKind.html('blah') 
Các vấn đề liên quan