2009-07-23 5 views
6

Я хотел бы расширить элемент DOM без расширения всех них. То есть, я бы хотел создать собственный класс со своими собственными методами и свойствами, но также иметь возможность рассматривать его как div. Например.Расширение элемента DOM с помощью 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(); 

Возможно ли это?

ответ

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'); 
+1

Это отлично подходит для расширения плагинов, переопределяя функции так, чтобы this.hide на самом деле this.fadeOut. Я использую __proto__ внутри класса и передаю ему базовый объект jquery следующим образом: [link] (http://pastebin.com/hFUnqTBQ) – Shanimal

0

jQuery не сможет понять m, когда вы передаете его в строку добавления, поскольку он принимает только строки и элементы. У вашего MyClass, вероятно, будет специальный ключ для хранения самого элемента (например, this.el = document.createElement («div»);), но jQuery не сможет найти это самостоятельно.

+0

Понял, вышеизложенное было всего лишь примером того, что я хотел сделать. В сущности, я ищу что-то вроде: MyClass: document.createElement ("div") То есть я не хочу говорить jquery, чтобы найти конкретный ключ, но jquery думаю, что сам объект является элемент, т.е. мой объект расширяет элемент. – pondermatic

1

Вы можете создать свой собственный объект, как и вы. Затем вы можете использовать jQuery's extend method для расширения элемента.

+0

Это не работает: "больше" функция больше() { \t \t \t \t this.myname = \t \t \t} \t \t \t more.prototype.alert = функция() { \t \t \t \t оповещения ('предупреждение!) \t \t \t} \t \t \t \t \t \t вар деления = $ (документ .createElement ("ДИВ")); \t \t \t div.html ("this is s"); \t \t \t \t \t \t $.extend (true, div, more); . \t \t \t \t \t \t $ (документ) .ready (функция() { \t \t \t \t $ ("тело") присоединять (дел); \t \t \t \t div.alert(); \t \t \t \t alert (div.myname); \t \t \t}); – pondermatic

+0

Право, вам нужен объект, а не функция для работы с методом 'extend'. замените соответствующую строку следующим: '$ .extend (true, div, new more);' – geowa4

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, вроде бы сосет. – pondermatic

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') 
Смежные вопросы