2016-09-01 1 views
0

Ich bin relativ neu zu jQuery und suchte nach einer Möglichkeit, addClass Callbacks zu erweitern. Ich fand diese Lösung here. Hier ist der Code-Teil, der die Magie tut:Erweitern von jQuery addClass, um Rückrufe zu akzeptieren - wie funktioniert es?

var oAddClass = $.fn.addClass; 
$.fn.addClass = function() { 
    for (var i in arguments) { 
     var arg = arguments[i]; 
     if (!! (arg && arg.constructor && arg.call && arg.apply)) { 
      arg(); 
      delete arg; 
     } 
    } 
    return oAddClass.apply(this, arguments); 
} 

Kann jemand erklären, was hier passiert? Ich habe Grundkenntnisse in Programmierungsterminologie und habe bereits jQuery für einfache Sachen wie Scroll-Over-Anzeigen verwendet.

Mit freundlichen Grüßen,

Nunu

+0

Offensichtlich kommt es von [hier] (http://stackoverflow.com/a/14568870/1414562) nicht [dort] (https://gist.github.com/gabrysiak/166befef3264d0c53f47) ... :) Und als eine Randnotiz wäre dies für die Verwendung von 'setTimeout (arg.bind (this));' anstelle von 'arg()' –

+0

@ A.Wolff Wolff von Bedeutung, was macht das 'setTimeout' in diesem Fall? –

+0

Verzögert die Callback-Funktion zur Ausführung ** nachdem ** die Klasse hinzugefügt wurde, nicht vorher wie im vorherigen gebuchten Code. 'bind()' wird verwendet, um den relevanten Kontext für die Callback-Methode festzulegen. 'this 'in diesem Fall ist die jq abgestimmt set/obj –

Antwort

2

Grundsätzlich Schleifen es über alle Argumente addClass aufgerufen wurde. Wenn dieses Argument eine Funktion ist (die durch Duck-Tippen herausgefunden wird, dass das Argument einen Konstruktor und Methoden zum Aufrufen/Anwenden hat), ruft es diese Funktion auf und entfernt sie aus dem arraylike-Objekt der Argumente. Schließlich werden die verbleibenden Argumente (die Nicht-Funktionen) auf das Element angewendet, indem der Verweis auf die ursprüngliche addClass-Funktion (oAddClass) verwendet wird, so dass die echten Klassenzeichenfolgen ebenfalls zu dem Element hinzugefügt werden.

Als Nebenbemerkung, warum würden Sie Callbacks auf setClass benötigen, da es nicht async ist.

+0

Ya, es macht keinen Sinn, einen Rückruf für die Synchronisierungsmethode –

+0

hinzufügen Eigentlich wollte ich ein Google machen analytics call, während ein bestimmtes Element eine Klasse erhält, die im Grunde 'display: none' auf' display: block' setzt. Danke für die Antwort übrigens. –

+0

Und woher kommt das Array (Objekt? Variable?) 'Argumente'? Soweit ich sehen kann, wurde es nirgendwohin erklärt. –