2009-07-01 5 views
2

Fast alle Beispiele in den jQuery-Tutorials, die ich gelesen habe, verwenden normalerweise eine wichtige öffentliche Funktion für die Auswahl des Plugins. Wenn ich "Auswahl" -Plugin sage, meine ich eine, die nicht einfach eine statische Funktion ist, die auf jQuery erweitert wird.Ist es möglich, eine zweite nicht-statische, selecting, priviledged Funktion in einem JQuery Plugin zu schreiben?

Zum Beispiel:

(function($) { 

jQuery.fn.actionList = function(options) { 
    var opts = $.extend({}, $.fn.actionList.defaults, options); 
    return this.each(function(){ 
     alert(this); 
    }); 

}; 

$.fn.actionList.defaults = { 
    listHtml: '<div>Set the list html</div>' 
}; 

})(jQuery); 

aber nicht:

jQuery.log = function(message) { 
    if(window.console) { 
    console.debug(message); 
    } else { 
    alert(message); 
    } 
}; 

Dies funktioniert für die meisten Dinge in Ordnung, aber was ich möchte, ist zu tun in der Lage eine zweite Funktion auf dem Objekt zu nennen zurück vom ersten Anruf an.

var actionBox = $('actionBox').actionList(options); 

//Many light-cycles later 

actionBox.refreshData(data); 

oder vielleicht sogar:

$('actionBox').actionList(options); 

// laaateerr 

$('actionBox').actionList.refreshData(data); 

Ich bin eine oder beide von diesen zu raten ist nicht möglich oder zumindest nicht ratsam, aber ich bin jetzt nur noch in die tiefsten Aspekte von jQuery bekommen und Javascript.

Kann jemand erklären, wie man das macht, oder wenn es nicht möglich oder ratsam ist, warum? und was würden sie stattdessen tun?

Danke fürs Lesen!

Antwort

2

Ich bin nicht ganz sicher, was Sie bekommen, aber Sie können eine zweite Funktion für das Objekt aus der ersten Funktion aufrufen - in der Tat ist es sehr empfehlenswert, ein jQuery-Objekt von Ihren Plugins zurückzugeben, und der Grund, warum Sie Befehle in jQuery verketten können.

Verwenden Sie Ihre Beispiele

var actionBox = $('actionBox').actionList(options); 

//Many light-cycles later 

actionBox.refreshData(data); 

würde gut funktionieren, solange beide .actionList() und .refreshData(data) Befehle beide geben ein Objekt jQuery.

Und

$('actionBox').actionList.refreshData(data); 

müssten

$('actionBox').actionList().refreshData(data); 

EDIT sein:

am jQuery Quellcode Sehen,

jQuery.fn = jQuery.prototype = { 
    /* 
     Load of 'property' functions of jQuery object... 
    */ 
} 

So erweitert das Hinzufügen von Eigenschaften (a.k.a-Plugins) zu jQuery.fn den Prototyp des jQuery-Objekts. Wenn Sie

$(selector, context); 

rufen ein neues jQuery-Objekt zurückgegeben wird, Objekt die initEigenschaft Funktion der Verwendung von jQuery

jQuery = window.jQuery = window.$ = function(selector, context) { 
    // The jQuery object is actually just the init constructor 'enhanced' 
    return new jQuery.fn.init(selector, context); 
}, 
+0

Hey vielen Dank für die Antwort, ist es möglich, wenn Sie mir ein Beispiel zeigen? –

+0

Ich meine, wie würden Sie dies auf der Plugin-Deklaration Seite definieren, vorausgesetzt, die Funktion tut nichts. Tut mir leid wegen dem Ärger. –

+0

Es tut mir wirklich leid, hätte ich sagen sollen, wie in einer theoretischen jquery.actionlist.js die refreshData (data) -Funktion geschrieben werden könnte. Das hat mich feststecken lassen. –

1

Ich glaube, ich habe ein Plugin bekam, die für Sie sehr nützlich sein könnten . Es erlaubt Ihnen, jedes Konstruktor/Objekt auf jQuery als eigenen Namespace AND anzuwenden und Sie können 'this' verwenden, wie Sie normalerweise mit jQuery auf den Objektsatz verweisen würden.Mit diesem [Methoden] eine Methode für das Objekt aufrufen wird, usw.

http://code.google.com/p/jquery-plugin-dev/source/browse/trunk/jquery.plugin.js

sind einige Code-Beispiele hier:

http://groups.google.com/group/jquery-dev/browse_thread/thread/664cb89b43ccb92c/34f74665423f73c9?lnk=gst&q=structure+plugin+authoring#34f74665423f73c9

Es ist etwa in der Mitte der Seite.

Ich hoffe, Sie finden es nützlich!

Verwandte Themen