2012-11-30 8 views
6

Ich habe ein Combobox-Plugin erstellt. Um es zu nutzen, müssen nennenWie kann ein jQuery-Plugin gleichzeitig an mehreren Elementen arbeiten?

Sie nur
$(elem).combobox(compensateElement); 

EDIT: Problem ist, dass wenn Sie

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

das Plugin tun brechen ...

Der Elem ist die Auswahl der zu verwandelte sich in eine Combobox, und das compensateElement ist ein Element, nach dem das Plugin ein div einfügen kann, das die Länge der SuggestivesDiv-20px hoch ist. (Ich habe eine Fußzeile auf meiner Seite, die nicht von absolut positionierten Elementen gedrückt wird ...)

Jetzt ist das Problem, dass dieses Plugin NUR AUF EINEM ELEMENT VERWENDET WERDEN KANN! Wie kann es geändert werden, so dass es an mehreren Elementen gleichzeitig arbeiten kann? Es sind mehr als hundert Zeilen JS-Code, also erwarte ich nicht den "konvertierten" Code!

Ich habe daran gedacht, alle elementspezifischen Variablen in das this.data "Objekt" zu schreiben, aber es fühlte sich überhaupt nicht wie eine gute Lösung an. Nach dem Ausführen einiger RegEx finden & ersetzen Sie es und konfigurieren es für ein paar Stunden, ich habe es überhaupt nicht funktionieren ...

Welche Techniken kann ich verwenden?

Vielen Dank für Ihre Zeit!

+0

Ich habe nicht die ganze Frage gelesen, aber wie wäre es? '$ ('# state, # another-id, .a-class'). combobox ('form');' (Nicht sicher, ob die '' Form '' am Ende in Ordnung ist, wie es ist. Ich nicht weiß, wie diese "Form" angesprochen wird. – Joonas

+0

Was meinst du mit "Arbeit mit mehreren Elementen"? Sie möchten zum Beispiel '$ ('select'). Combobox()' und dies auf alle anwenden? –

+0

Ich meine, mehrere Auswahlen in Comboboxen verwandeln zu können. –

Antwort

10

Das Problem ist, dass Sie eine literal object haben, dass sein Inhalt jedes Mal haben Sie m.init() rufen ersetzt.

Ich schlage vor, Sie this post betrachten, die gute Ansätze zum Schreiben von JQuery-Plugins erklärt. Wenn Sie sehen, den „Leichten Start“, zum Beispiel:

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

dies für jedes Element eine neue Instanz des Plug-ins Objekt erstellt, so dass Sie Zustand konsequent beibehalten.

+0

Sie, mein Freund, sind ein leichtgläubiger! Vielen Dank! Ich fühle mich jetzt so extrem dumm! Ich weiß, was das Problem war, aber niemals, dass die Lösung so einfach sein könnte! Danke noch einmal! –

0

können Sie Ihre Plugin-Methoden für jedes Element mit jQuery jede Funktion aufrufen. Denken Sie daran, dass innerhalb Ihrer Methoden das Schlüsselwort this auf das aktuelle Element verweist und nicht auf das jQuery-Objekt.

$.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, dieser Code macht es möglich, '$ (' Wählen Sie '). Combobox (' Form '); 'Richtig? –

+0

Ja ...es wird auf jedem Knoten iterieren und die Plugin-Methode dazu aufrufen :) – Ehtesham

+0

Ja, aber das ist leider nicht mein Problem. Vielleicht werde ich die Frage aktualisieren. Wenn Sie '$ ('# 1') tun: combobox ('form'); $ ('# 2'). Combobox ('form');', wird das Plugin abbrechen. –

Verwandte Themen