Ich versuche, ein jQuery-Plugin zu schreiben, das dem Objekt, das es aufruft, zusätzliche Funktionen / Methoden bietet. Alle Tutorials, die ich online gelesen habe (die ich in den letzten 2 Stunden durchsucht habe), enthalten höchstens das Hinzufügen von Optionen, jedoch keine zusätzlichen Funktionen.
Folgendes möchte ich tun:
// formatiere div als Nachrichtencontainer, indem du das Plugin für dieses div aufrufst
$("#mydiv").messagePlugin();
$("#mydiv").messagePlugin().saySomething("hello");
oder so ähnlich. Es läuft darauf hinaus: Ich rufe das Plugin auf und rufe dann eine Funktion auf, die diesem Plugin zugeordnet ist. Ich kann anscheinend keinen Weg finden, dies zu tun, und ich habe schon viele Plugins gesehen, die dies getan haben.
Folgendes habe ich bisher für das Plugin:
jQuery.fn.messagePlugin = function() {
return this.each(function(){
alert(this);
});
//i tried to do this, but it does not seem to work
jQuery.fn.messagePlugin.saySomething = function(message){
$(this).html(message);
}
};
Wie kann ich so etwas erreichen?
Danke dir!
Update 18. November 2013: Ich habe die richtige Antwort auf die folgenden Kommentare und Upvotes von Hari geändert.
quelle
this.data('tooltip', $.extend(true, {}, $.fn.tooltip.defaults, methodOrOptions));
Jetzt kann ich nach der Initialisierung jederzeit auf Optionen zugreifen.init
.Hier ist das Muster, das ich zum Erstellen von Plugins mit zusätzlichen Methoden verwendet habe. Sie würden es wie folgt verwenden:
oder, um eine Methode direkt aufzurufen,
Beispiel:
quelle
;
in Ihrer ersten Zeile? Bitte erklären Sie mir :)Was ist mit diesem Ansatz:
Die ausgewählten Objekte werden im messagePlugin-Abschluss gespeichert, und diese Funktion gibt ein Objekt zurück, das die mit dem Plugin verknüpften Funktionen enthält. In jeder Funktion können Sie die gewünschten Aktionen für die aktuell ausgewählten Objekte ausführen.
Sie können mit dem Code testen und spielen hier .
Bearbeiten: Der Code wurde aktualisiert, um die Leistungsfähigkeit der jQuery-Verkettbarkeit zu erhalten.
quelle
$('p').messagePlugin()
wenn Sie eine der beiden zurückgegebenen Funktionen aufrufen.Das Problem mit der aktuell ausgewählten Antwort besteht darin, dass Sie nicht für jedes Element in der Auswahl eine neue Instanz des benutzerdefinierten Plugins erstellen, wie Sie denken ... Sie erstellen tatsächlich nur eine einzelne Instanz und übergeben sie der Selektor selbst als Bereich.
Sehen Sie sich diese Geige für eine tiefere Erklärung an.
Stattdessen müssen Sie den Selektor mit jQuery.each durchlaufen und für jedes Element im Selektor eine neue Instanz des benutzerdefinierten Plugins instanziieren.
Hier ist wie:
Und eine funktionierende Geige .
Sie werden feststellen, dass in der ersten Geige alle Divs immer genau die gleiche Anzahl von Pixeln nach rechts verschoben werden. Dies liegt daran , dass für alle Elemente im Selektor nur ein Optionsobjekt vorhanden ist.
Wenn Sie die oben beschriebene Technik verwenden, werden Sie feststellen, dass in der zweiten Geige nicht jedes Div ausgerichtet und zufällig verschoben wird (mit Ausnahme des ersten Div, da der Randomizer in Zeile 89 immer auf 1 gesetzt ist). Das liegt daran, dass wir jetzt für jedes Element im Selektor eine neue benutzerdefinierte Plugin-Instanz ordnungsgemäß instanziieren. Jedes Element hat ein eigenes Optionsobjekt und wird nicht im Selektor gespeichert, sondern im Fall des benutzerdefinierten Plugins.
Dies bedeutet, dass Sie über neue jQuery-Selektoren auf die Methoden des benutzerdefinierten Plugins zugreifen können, die für ein bestimmtes Element im DOM instanziiert wurden, und nicht gezwungen sind, sie wie in der ersten Geige zwischenzuspeichern.
Dies würde beispielsweise ein Array aller Optionsobjekte unter Verwendung der Technik in der zweiten Geige zurückgeben. Es würde im ersten undefiniert zurückkehren.
Auf diese Weise müssten Sie in der ersten Geige auf das Optionsobjekt zugreifen und nur ein einzelnes Objekt zurückgeben, kein Array davon:
Ich würde vorschlagen, die obige Technik zu verwenden, nicht die aus der aktuell ausgewählten Antwort.
quelle
$('.my-elements').find('.first-input').customPlugin('update', 'first value').end().find('.second-input').customPlugin('update', 'second value'); returns Cannot read property 'end' of undefined
. jsfiddle.net/h8v1k2pLjQuery hat dies mit der Einführung der Widget Factory erheblich vereinfacht .
Beispiel:
Initialisierung:
Methodenaufruf:
(So wird die jQuery-UI- Bibliothek erstellt.)
quelle
Ein einfacherer Ansatz ist die Verwendung verschachtelter Funktionen. Dann können Sie sie objektorientiert verketten. Beispiel:
Und so nennt man es:
Sei aber vorsichtig. Sie können eine verschachtelte Funktion erst aufrufen, wenn sie erstellt wurde. Sie können dies also nicht tun:
Die DoEvenMore-Funktion existiert nicht einmal, da die DoSomething-Funktion noch nicht ausgeführt wurde, die zum Erstellen der DoEvenMore-Funktion erforderlich ist. Für die meisten jQuery-Plugins haben Sie wirklich nur eine Ebene verschachtelter Funktionen und nicht zwei, wie ich hier gezeigt habe.
Stellen Sie einfach sicher, dass Sie beim Erstellen verschachtelter Funktionen diese Funktionen am Anfang ihrer übergeordneten Funktion definieren, bevor ein anderer Code in der übergeordneten Funktion ausgeführt wird.
Beachten Sie schließlich, dass das Element "this" in einer Variablen namens "_this" gespeichert ist. Für verschachtelte Funktionen sollten Sie "_this" zurückgeben, wenn Sie einen Verweis auf die Instanz im aufrufenden Client benötigen. Sie können "this" nicht einfach in der verschachtelten Funktion zurückgeben, da dadurch ein Verweis auf die Funktion und nicht auf die jQuery-Instanz zurückgegeben wird. Durch die Rückgabe einer jQuery-Referenz können Sie intrinsische jQuery-Methoden bei der Rückgabe verketten.
quelle
Ich habe es von jQuery Plugin Boilerplate bekommen
Auch in jQuery Plugin Boilerplate beschrieben, Reprise
quelle
$('.first-input').data('pluginName').publicMethod('new value').css('color', red);
gibtCannot read property 'css' of undefined
jsfiddle.net/h8v1k2pL/1return $element
so dass Sie es in diesem Beispiel inplugin.foo_public_method = function() {/* Your Code */ return $element;}
@Salim ändern würden, danke, dass Sie mir geholfen haben ... github.com/AndreaLombardo/BootSideMenu/pull/34Zu spät, aber vielleicht kann es eines Tages jemandem helfen.
Ich war in der gleichen Situation wie beim Erstellen eines jQuery-Plugins mit einigen Methoden, und nachdem ich einige Artikel und einige Reifen gelesen hatte, erstellte ich ein jQuery-Plugin-Boilerplate ( https://github.com/acanimal/jQuery-Plugin-Boilerplate ).
Außerdem entwickle ich damit ein Plugin zum Verwalten von Tags ( https://github.com/acanimal/tagger.js ) und schreibe zwei Blog-Beiträge, in denen Schritt für Schritt die Erstellung eines jQuery-Plugins ( http: // acuriousanimal) erläutert wird. com / blog / 2013/01/15 / Dinge, die ich gelernt habe, ein jquery-Plugin-Teil-i zu erstellen / ).
quelle
Du kannst tun:
Auf diese Weise wird Ihr Plugins-Objekt als Datenwert in Ihrem Element gespeichert.
quelle
Was ist mit Triggern? Kennt jemand einen Nachteil bei der Verwendung? Der Vorteil ist, dass alle internen Variablen über die Trigger zugänglich sind und der Code sehr einfach ist.
Siehe auf jsfiddle .
Anwendungsbeispiel
Plugin
quelle
Hier möchte ich Schritte vorschlagen, um ein einfaches Plugin mit Argumenten zu erstellen.
Hier haben wir das aufgerufene
params
Standardobjekt hinzugefügt und die Standardwerte der Optionen mithilfe derextend
Funktion festgelegt. Wenn wir also ein leeres Argument übergeben, werden stattdessen Standardwerte festgelegt, andernfalls wird es festgelegt.Lesen Sie mehr: So erstellen Sie ein JQuery-Plugin
quelle
Probier diese:
quelle
Hier ist meine Bare-Bones-Version davon. Ähnlich wie bei den zuvor geposteten würden Sie wie folgt anrufen:
-oder greifen Sie direkt auf die Instanz zu @
plugin_MessagePlugin
MessagePlugin.js
quelle
Die folgende Plugin-Struktur nutzt die jQuery-
data()
-Methode eine öffentliche Schnittstelle zu internen Plugin-Methoden / -Einstellungen , um (während jQuery-Verkettbarkeit Erhaltung):Jetzt können Sie interne Plugin-Methoden aufrufen, um mithilfe dieser Syntax auf Plugin-Daten oder das entsprechende Element zuzugreifen oder diese zu ändern:
Solange Sie das aktuelle Element (this) aus Ihrer Implementierung von
myPublicPluginMethod()
jQuery-chainability zurückgeben, bleibt Folgendes erhalten: Folgendes funktioniert:Hier sind einige Beispiele (Einzelheiten finden Sie in dieser Geige ):
quelle
Dies kann tatsächlich dazu gebracht werden, auf "nette" Weise mit zu arbeiten
defineProperty
. Wobei "nett" bedeutet, dass Sie()
weder den Plugin-Namespace abrufen noch den Funktionsnamen als Zeichenfolge übergeben müssen.Kompatibilitäts-Nit: Funktioniert
defineProperty
nicht in alten Browsern wie IE8 und niedriger. Vorsichtsmaßnahme:$.fn.color.blue.apply(foo, args)
funktioniert nicht, müssen Sie verwendenfoo.color.blue.apply(foo, args)
.JSFiddle-Link
quelle
Gemäß dem jquery-Standard können Sie das Plugin wie folgt erstellen:
Wie rufe ich dieses Plugin auf?
Referenz: Link
quelle
Ich denke, das könnte dir helfen ...
Im obigen Beispiel hatte ich ein einfaches jquery- Highlight- Plugin erstellt. Ich hatte einen Artikel geteilt, in dem ich über das Erstellen eines eigenen jQuery-Plugins von Basic bis Advance gesprochen hatte. Ich denke, Sie sollten es überprüfen ... http://mycodingtricks.com/jquery/how-to-create-your-own-jquery-plugin/
quelle
Im Folgenden finden Sie ein kleines Plug-In mit einer Warnmethode zum Debuggen. Behalten Sie diesen Code in der Datei jquery.debug.js: JS:
HTML:
quelle
So mache ich das:
quelle
Sie haben im Grunde das Objekt jQuery.fn.messagePlugin um eine neue Methode erweitert. Welches ist nützlich, aber nicht in Ihrem Fall.
Sie müssen diese Technik anwenden
Aber Sie können erreichen, was Sie wollen. Ich meine, es gibt eine Möglichkeit, $ ("# mydiv") zu tun. MessagePlugin (). SaySomething ("hello"); Mein Freund, er hat angefangen, über Lugins zu schreiben, und wie man sie mit Ihrer Funktionskette erweitert, hier ist der Link zu seinem Blog
quelle