2012-11-30 13 views
6

Zrobiłem wtyczkę combobox. Aby z niego skorzystać, wystarczy zadzwonićJak sprawić, aby wtyczka jQuery działała na wielu elementach jednocześnie?

$(elem).combobox(compensateElement); 

EDIT: Problem jest, że jeśli zrobić

$('#1').combobox('form'); 
$('#2').combobox('form'); 

plugin złamie ...

elem to wybierz się przekształcony w combobox, a compensateElement jest elementem, po którym wtyczka może wstawić div, który jest długością sugestiiDiv-20px high. (Mam stopkę na mojej stronie, która nie jest wypychana przez elementy pozycjonowane absolutnie ...)

Problem polega na tym, że wtyczkę można używać TYLKO W JEDNYM ELEMENTU! Jak można go zmienić, aby działał jednocześnie na wielu elementach? To więcej niż sto linii kodu JS, więc nie oczekuję "skonwertowanego" kodu!

Myślałem o umieszczeniu wszystkich zmiennych elementarnych w "obiekcie" this.data, ale w ogóle nie wydawało mi się to dobrym rozwiązaniem. Po uruchomieniu jakiegoś RegEx znajdź & zamień go i skonfiguruj na kilka godzin, ale nie udało mi się go w ogóle uruchomić ...

Jakich technik mogę użyć?

Dziękuję bardzo za poświęcony czas!

+0

Nie do końca przeczytałem całe pytanie, ale co z tego? '$ ('# state, # inny-id, .a-class'). combobox ('formulacje');' (Nie jestem pewien, czy '' form'' na końcu jest w porządku, tak jak jest. wiedzieć, jak ta "forma" jest celem). – Joonas

+0

Co masz na myśli mówiąc "praca z wieloma elementami"? Chcesz na przykład zrobić '$ ('select'). Combobox()' i zastosować to do wszystkich z nich? –

+0

Mam na myśli, aby móc włączyć wiele zaznaczeń w comboboxes. –

Odpowiedz

10

Problemem jest to, że masz literal object, że będzie musiał zastąpić jego zawartość za każdym razem, kiedy zadzwonić m.init().

Sugeruję, aby spojrzeć na this post, która wyjaśnia dobre podejście do pisania wtyczek JQuery. Jeśli widzisz „Lekki Start”, na przykład:

$.fn[pluginName] = function (options) { 
     return this.each(function() { 
      if (!$.data(this, 'plugin_' + pluginName)) { 
       $.data(this, 'plugin_' + pluginName, 
       new Plugin(this, options)); 
      } 
     }); 
    } 

to tworzy nową instancję obiektu plugin dla każdego elementu, dzięki czemu można utrzymać stan konsekwentnie.

+0

Ty, mój przyjacielu, jesteś łatwowierny! Dziękuję Ci bardzo! Czuję się teraz tak bardzo głupi! Wiem, jaki był problem, ale nigdy nie było tak proste! Dzięki jeszcze raz! –

0

możesz wywoływać metody wtyczek na każdym elemencie z każdą funkcją jQuery. Zapamiętaj w swoich metodach słowo kluczowe this wskaże bieżący element, a nie obiekt jQuery.

$.fn.combobox = function(form) { 
     var $this = this; 

     return $this.each(function() { 
      if (!m.initialized) { 
       m.init.apply(this, [form]); 
       $this.data('initialized', true); 
      } else { 
       m.updateList.apply(this); 
      } 
     }); 
    }; 
+0

Hmm, ten kod umożliwia zrobienie '$ (' wybierz "). combobox (" formularz ");" Tak? –

+0

Tak ...będzie iterować na każdym węźle i wywoływać metodę wtyczki na tym :) – Ehtesham

+0

Tak, ale niestety to nie jest mój problem. Może zaktualizuję pytanie. Jest tak, że jeśli zrobisz '$ ('# 1'). Combobox (" formularz "); $ (" # 2 "). Combobox (" formularz ");', wtyczka się zepsuje. –

Powiązane problemy