2012-10-30 5 views
27

Die meisten jQuery-Plugins sind an einen DOM-Knoten gebunden/gebunden, wenn Sie sie zum ersten Mal initialisieren.Wie können Sie überprüfen, ob ein jQuery-Plugin bereits an einen DOM-Knoten gebunden ist?

$('#foo').bar({options: ...}); 

Wie kann man überprüfen, um zu sehen, welche Plug-in oder Objekten zur Zeit zu einem DOM-Knoten wie #foo gebunden sind?

if($('#foo').bar) 
if($.inArray('bar', $('#foo').eq(0))) 
if($('#foo').eq(0).indexOf('bar')) 
if($('#foo').hasOwnProperty('bar')) 

Zum Beispiel ist es möglich, die Ereignisse zu einem Objekt wie dieses

console.log($('#foo').data('events')); 
+2

Möchten Sie diese Antwort sicherlich wissen. Es wird beim Debuggen helfen. –

+0

Wie genau würden Sie _bound zu einem DOM node_ definieren? Fügen Sie [jquery-ui.js] (http://code.jquery.com/ui/1.9.1/jquery-ui.js) in Ihre Seite ein und jedes Element wird '.dialog()', '.autocomplete () 'etc wurde automatisch hinzugefügt. Sie werden an jeden Knoten gebunden. –

+0

@SalmanA, ich meine nur, dass ein Plugin ein DOM-Element aktiv überwacht oder beeinflusst. – Xeoncross

Antwort

8

gebunden zu bekommen, wenn das Plugin selbst in gewisser Weise definiert das Element zu verändern (n) es funktioniert auf, es ist nicht möglich . Zum Beispiel:

$.fn.extend({ 
    foo: function() { console.log("I am foo!"); } 
}); 

$('#bar').foo(); 

Hier definierte ich eine komplette (na ja, mehr-o-less) jQuery-Plugin, das nicht einmal mit seinem Aufruf Elemente zur Interaktion nicht versuchen. Dennoch können Sie es verwenden, wie Sie wollen, auf jeder jQuery-wrapped Sammlung von Elementen, wie jede jQuery-wrapped Sammlung von Elementen wegen dieser Linie diese Methode in seinem Prototyp hat (von jquery.js):

jQuery.fn = jQuery.prototype = { ... } 

... nach $.fn.extend wurde aufgerufen, dieses Plugin anzuschließen, kein Wortspiel beabsichtigt.

Aber selbst wenn mein Plugin erforderlich waren seine Berufung Element in irgendeiner Weise zu ändern, wie folgt aus:

$.fn.extend({ 
    bar: function() { this.html('I am all bar now!'); } 
}); 
$('#bar').bar(); 

... Ich würde immer noch müssen, im Grunde behandeln diese mit einigen externen Ereignissen (DOM Mutation Einsen) und nicht nur von einer internen jQuery-Protokollierung abhängen.

+1

Während dies sicherlich richtig ist (und vielleicht die Antwort), ändern die meisten Plugins das Element oder protokollieren eine Instanz zurück im Plugin-Objekt. Sie müssen eine Art generische Eigenschaft hinterlassen, die zurückverfolgt werden kann. Vielleicht Ereignisse, Klassen, IDs, '.data' oder etwas anderes. – Xeoncross

+0

@Xeoncross Warum sollte es eine _generic_ Eigenschaft sein, wenn jQuery keine Einschränkungen bezüglich des Verhaltens des Plugins hat? – raina77ow

+0

Vielleicht ist es besser gesagt als "generischer Ort" für eine Immobilie. Auf jeden Fall gibt es oft Muster, die man in solchen Situationen anwenden kann, um Dinge zu entdecken. Zum Beispiel fügen viele Plugins etwas zu ".data()" hinzu. – Xeoncross

3

In meinem Fall, das Plugin, das ich versuchte zu entdecken passiert, um einige Daten zu den Elementen $(element).data() Speicher hinzuzufügen. Ich habe auch Plugins gesehen, die Klassen oder IDs entweder mit ihrem Namen oder mit Änderungen ihres Namens hinzufügen.

Unten ist der Code, mit dem ich derzeit arbeite, um dieses Problem zu lösen. Funktioniert wahrscheinlich nicht für die meisten Plugins.

$.fn.extend({ 
    isPluginBound: function(pluginName) 
    { 
     if(jQuery().pluginName) 
     { 
      var name = pluginName.toLowerCase(); 

      return this.data(pluginName) || this.data(name) 
       || this.attr('class').toLowerCase().indexOf(name) !== -1 // vs hasClass() 
       || this.attr('id').toLowerCase().indexOf(name) !== -1; 
     } 
    } 
}); 

Um es zu verwenden Anruf nur $('#foo').isPluginBound('bar');

+1

Vielleicht würde ich 'if (jQuery(). PluginName)' durch 'if ($ .fn [pluginName])' hier ersetzen, aber das ist nur eine Nebenbemerkung. Tatsächlich speichern jQuery-UI-Plugins ihre Namen in den Daten der betroffenen Elemente, so dass Ihr Ansatz für sie wahrscheinlich gültig ist. Trotzdem, das beruht auf Interna. – raina77ow

+0

Und als weitere Randbemerkung wäre es vielleicht nett, in jedem Fall einen Booleschen Wert von 'isPluginBound' zurückzugeben (mit' '' '' '' '' ''' '' '' '' '' '' '' '' '' '' '' '' '' ' – raina77ow

+0

Immer lohnt sich die Überprüfung der .data(), danke - hat mir geholfen! – iamkeir

1

soweit ich weiß, alle jQuery Widgets ihre Instanz ihre DOM-Knoten anhängen. ich benutze folgende Erweiterung in meinen Projekten. es ist auch nützlich, eine Methode für ein Widget aufzurufen, von dem Sie den Namen nicht kennen (z. B. eine Basismethode eines erweiterten Widgets aufrufen)

Verwandte Themen