2009-07-21 5 views
2

Ich habe einige der ausführlicheren Schlupflöcher von JS hier und dort gelernt, und habe ein paar Dinge, die ich brauche, um Hilfe zu bekommen.Javascript Reference Comprehension

;(function($){ 
    $.fn.makeRed1 = function() { 
     return $.each(this, function() { 
      $(this).css('background-color', '#FF0000'); 
     }); 
    } 
})(jQuery) 


;(function($){ 
    $.fn.makeRed2 = function() { 
     $(this).css('background-color', '#FF0000'); 
    } 
})(jQuery) 

Beide dieser Arbeit richtig. Warum?

Jeder, der über das Schreiben von Plugins spricht, sagt immer die Methode "return each". Was ist der Grund? Ich brauche jemanden, der mir genau sagt, was passiert, wenn jede dieser Methoden verwendet wird, damit ich den Fluss verstehen kann.

Danke.

Antwort

2

Im ersten Fall geben Sie die Ergebnisse der einzelnen Funktionen explizit zurück. Die einzelnen Funktionen durchlaufen die übereinstimmenden Elemente und wenden den jeweils angegebenen Rückruf an. Der Rückgabewert der Funktion ist das jQuery-Objekt, das den ausgewählten Elementen entspricht. Dadurch können Sie die neu definierte Funktion so verketten, wie die Benutzer von jQuery erwarten und zusätzliche jQuery-Funktionen auf die ausgewählten Elemente anwenden.

Im zweiten Fall haben Sie eine einfache Anweisung, die denselben Callback anwendet, wenn auch direkt. Da Sie nichts zurückgeben, können Sie diese Funktion nicht ketten. Dies bricht das jQuery-Paradigma.

+0

Ok, aber da alle Elemente davon betroffen sind, ob du "each" verwendest oder nicht, warum "each" verwenden? Wenn mein Verständnis korrekt ist: return $ (this) .css ('background-color', '# FF0000'); 'würde das jQ-Objekt trotzdem zur Verkettung zurückgeben. Ich interessiere mich mehr für die Verwendung von "jeder" oder nicht. – Spot

+0

Betrachten Sie ein komplexeres Plugin/eine Funktion, die aus mehreren Anweisungen besteht, von denen viele nicht miteinander verkettet sind und von denen einige jQuery möglicherweise nicht zurückgeben. Die Verwendung der einzelnen Syntax bietet einen praktischen Mechanismus, um all dies in eine Methode einzubetten, mit der Sie Ihren Code schreiben können, ohne einen Verweis auf die ursprüngliche jQuery-Sammlung zu behalten. – tvanfosson

+0

Ah ok, vielen Dank. – Spot

1

Ohne die each Schleife funktioniert Ihre Funktion nur mit dem ersten ausgewählten Element. Mithilfe von each können Sie mehrere ausgewählte Elemente mit einem einzigen Methodenaufruf bearbeiten.

Das Beenden der Funktion, indem this zurückgegeben wird, erleichtert die Verkettung der jQuery-Stilmethode.

Verwendung:

return this.each(function() { /* do stuff */ }); 

ist nur eine Abkürzung für:

this.each(function(){ /* do stuff */); 
return this; 

Re: Kommentar: Der Grund, warum nichteach Werke in Ihrem Beispiel verwendet wird, ist, weil die .css() Methode verwendet each intern. Wenn Sie in Ihrem Beispiel-Plug-in tatsächlich etwas Brauchbares wie das manuelle Bearbeiten des DOM oder nativer Element-Objekte verwenden, müssen Sie jedes verwenden, um Ihre Änderungen auf alle ausgewählten Elemente anzuwenden.

+0

Ok, die Rückkehr macht Sinn, aber die Nicht-jede Methode funktioniert immer noch über alle Elemente. Das hat mich verwirrt, ich nahm an, dass jeder mehrere Elemente transversieren sollte, aber nein. – Spot

1

Grundsätzlich ist der return $ .each Anweisung, können Sie die elegante jQuery Verkettungs Paradigma erhalten, lassen Sie uns sagen, Sie haben zwei benutzerdefinierte jQuery-Funktionen:

;(function($){ 
    $.fn.makeRed = function() { 
     return $.each(this, function() { 
      $(this).css('background-color', '#FF0000'); 
     }); 
    } 

    $.fn.makeBold = function() { 
     return $.each(this, function() { 
      $(this).css('font-weight', 'bold'); 
     }); 
    } 
})(jQuery) 

Sie könnten die folgende Anweisung zum Beispiel schreiben, ohne Problem:

$(selector).makeRed().makeBold().show();