2013-01-11 15 views
5

Muszę wywołać funkcję niestandardową po przełączeniu wszystkich moich elementów. Nie dla każdego.jQuery konkatenacja funkcji niestandardowej

Powiedzmy mamy Alert:

function myAlert() { alert("OK"); } 

Gdybym kodować tak, wywołuje za każdym razem włącza ona:

$('div.myGroupOfItems').toggle('fast',function() { 
myAlert(); 
}); 

jaki sposób można zrobić to w ten sposób, ponieważ kopalnia niestandardowa funkcja JS? W ten sposób to nie działa:

$('div.myGroupOfItems').toggle('fast').myAlert(); 

Lub inne rozwiązania?

+0

Aby dodać. Metoda myAlert() dla obiektu jQuery zobacz http://docs.jquery.com/Plugins/Authoring –

Odpowiedz

5

Można to wykorzystać z jQuery 1.6 roku ...

$('div.myGroupOfItems').toggle('fast'); 

$('div.myGroupOfItems').promise().done(function() { 
    myAlert(); 
}); 
8

Będziesz musiał rozszerzyć jQuery, aby dodać do niego swoją metodę. Można to zrobić tak:

$.fn.myAlert = function() { 
    alert("OK"); 
}; 

Jeśli chcesz, aby móc łańcuchowych innych metod jQuery potem trzeba wrócić this od wtyczki.

Oto working example.


Jeśli interesuje Cię to, co w tej chwili jest bardziej szczegółowe, czytaj dalej. $.fn to po prostu alias dla $.prototype. Dodając właściwość do prototype, skutecznie rozszerzasz wszystkie instancje jQuery.

Po wywołaniu $, jQuery wewnętrznie tworzy instancję (nie trzeba tworzyć instancji ręcznie, np. Za pomocą operatora new). Ponieważ rozszerzyłeś $.prototype, wszystkie wystąpienia będą teraz miały dostęp do Twojej nowej metody.

Jeśli użyjesz kodu dokładnie tak, jak pokazałem powyżej (bez instrukcji return), nie będziesz mógł łączyć dalszych wywołań z metodami jQuery. Powracając wystąpienie od sposobu połączenia będzie chainable:

$.fn.myAlert = function() { 
    alert("OK"); 
    return this; 
}; 

Należy pamiętać, że wewnątrz metody, this odnosi się do instancji jQuery, więc nie ma potrzeby, aby owinąć go w niepotrzebne wezwanie do $.

+0

Nie chodzi tylko o niestandardową funkcję jquery ... Nie może tego użyć, ponieważ funkcja przełączania jest wykonywana asynchronicznie. Oznacza to, że ostrzeże, zanim wszystko zostanie zrobione. – VDP

+0

@ VDP - Ah, dobry punkt. W takim przypadku OP, spójrz na odpowiedź ATOzTOA. Jeśli chcesz kombinację obu, buforuj odwołanie do obiektu jQuery i wywołaj 'myAlert' na tym z wewnątrz wywołania zwrotnego. –

+0

Mam zamiar wypróbować odpowiedź ATOzTOA, ale czy mogę zadzwonić bezpośrednio do mojej funkcji, np. Po załadowaniu okna po użyciu twojego kodu? w ten sposób nie działa $ .myAlert() –

4

Aby używać tej składni, czego potrzeba, aby uczynić swoją funkcję w plugin jQuery tak:

$.fn.extend({   
    myAlert: function() { 
     alert('OK'); 
     return this; // return the assigned elements to continue chaining. 
    } 
}); 

$('div.myGroupOfItems').toggle('fast').myAlert(); 
+0

'return $ (this);', no? – jeremy

+3

@Nile - Nie, ponieważ 'fn' jest po prostu aliasem dla' prototype', 'this' będzie odnosić się do instancji jQuery. –

+0

@JamesAllardice Oh, okay. – jeremy

Powiązane problemy