![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 348 Pomógł: 26 Dołączył: 8.10.2008 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
Witajcie,
Robię różne wtyczki JS między innymi za pomocą takich artykułów: http://www.altcontroldelete.pl/artykuly/ja...yczki-w-jquery/ ale te moje wtyczki często potrzebują działać niestandardowo a ja nie moge nic zrobić bo nie rozumiem jak to działa... Szukam po necie jakichś wytłumaczeń ale nic konkretnego nie działa... Nie widzę w tym żadnej logiki i nawet jak działa to nie wiem dlaczego. Dziwność zaczyna się w momencie ...return this.each(function() {... Co do wieloinstancyjności i kłopotach z tym związanych spędziłem dziesiątki godzin... Znacie może jakiś dobry artykuł na ten tenat w języku polskim? A może ktoś potrafi sam wyjaśnić jak to jest z tymi wtyczkami jQuery.... -------------------- Wolałem języki z rodziny C ale poszedłem na łatwizne...
|
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 62 Pomógł: 3 Dołączył: 30.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Cześć,
generalnie według mnie najpierw powinno się nauczyć pisać w jQuery a potem brać za tworzenie pluginów ![]() Mogę Ci to w skrócie wytłumaczyć ale to Ty sam musisz przysiąść i poćwiczyć korzystanie z jQuery, zachęcam do tego bo warto! ![]() Co do tego kodu, przede wszystkim składnia jQuery opiera się na podstawowym obiekcie o takiej samej nazwie, zapisywany skrótowo jako "$". Natomiast każdy plugin to tak na prawdę definicja nowej funkcji która albo rozszerza już istniejące mechanizmy w jQuery ($.extend) albo wprowadza zupełnie nowe. Dlatego definicja tego pluginu zaczyna się od "(function($)", a kończy się zwróceniem obiektu jQuery czyli "(jQuery);". Kawałek kodu który wymieniłeś
zwraca wykonanie funkcji jQuery.each(), w tym przypadku jest to samo co:
Zobacz tutaj po polski opis: http://www.i-mateusz.com/news/jak-napisac-...gin-jquery.html polecam też dokumentację jQuery: http://api.jquery.com/ Cytat("Adi32") Co do wieloinstancyjności i kłopotach z tym związanych spędziłem dziesiątki godzin... to nie wiem czy dobrze rozumiem, chciałbyś wdrożyć wzorzec Singleton w JS? Może coś takiego:http://www.dofactory.com/javascript-singleton-pattern.aspx Ten post edytował iwosz 24.03.2014, 15:41:13 -------------------- Pozdrawiam,
iwosz. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Dziwność zaczyna się w momencie ...return this.each(function() {... Jeśli twoja wtyczka nazywa się superWtyczka i wywołasz ją tak:
to wewnątrz powyższej funkcji, w zmiennej this otrzymasz kolejne elementy, które wybrał selektor. -------------------- |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 348 Pomógł: 26 Dołączył: 8.10.2008 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za odpowiedź Panowie.
Napisałem już dość sporo działających wtyczek i innych rzeczy pomocy jQuery także zdaje mi się, że podstawy już znam. Żeby lepiej pokazać o co mi chodzi napisze co robiłem ostatnio: Napisałem wtyczkę do jQuery (kod mam w pracy, jutro wrzucę) która nazywa się Validate. Potrzebowałem aby konkretne pola konkretnych formularzy były walidowane tylko w konkretnych przypadkach dynamicznie. Ostatecznie działa to tak, że powiedzmy mamy formularz (#loginForm) na stronie z dwoma polami - email, hasło:
W tym momencie jeśli spróbujemy dać submit albo blur na inpucie klasa Validate odpala domyślny komunikat przy polu o błędnych danych, dla każdego pola możemy też przypisać konkretny komunikat.
Problemy zaczęły pojawiać się, gdy na stronie pojawiały się 2 formularze. Mają działać pod klasą Validate bez kolidacji, to właśnie miałem na myśli mówiąc o wielo-instancyjności, czyli raczej odwrotności singletona. Problem wyglądał tak że nie dawało się kliknąć w submit jeśli w którymkolwiek formularzu coś się nie walidowało. Z tym też sobie poradziłem, ale raczej metodą prób i błędów tworząc kod którego nie rozumiem dlatego postanowiłem założyć ten temat. Wciąż nie rozumiem return this.each... each to jak mniemam pętla po wszystkich "obiektach obiektu" (tak mi się przynajmniej wydaje) także jaki jest sens takiego zapisu? Wierzę , że jak to zrozumiem to zrozumiem i resztę. Jak mówiłem, wrzucam kod:
Przykłady użycia:
Trochę się to różni od tego co napisałem wczoraj. Coś mi sie widać popieprzyło. Moje szczere oczekiwania odnośnie tego tematu są takie, że ktoś napisze: "Co żeś napisał, powinieneś to zrobić inaczej"... Pozdrawiam. Ten post edytował Adi32 1.04.2014, 20:24:32 -------------------- Wolałem języki z rodziny C ale poszedłem na łatwizne...
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Wciąż nie rozumiem return this.each... each to jak mniemam pętla po wszystkich "obiektach obiektu" (tak mi się przynajmniej wydaje) także jaki jest sens takiego zapisu? this.each iteruje po wszystkich elementach, które podlegają selektorowi, który to podałeś jako parametr przy inicjalizacji pluginu. Jeśli Twój plugin wywołasz tak:
to pętla obejmie wszystkie formularze w dokumencie, jeśli tak:
to wszystkie formularze z klasą "blabla". Wszystko co dotyczy danego elementu musisz deklarować jako zmienną wewnątrz pętli each, a nie jako zmienne globalne. Również opcje musisz sobie kopiować do zmiennej w środku each. -------------------- |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 348 Pomógł: 26 Dołączył: 8.10.2008 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
Z Twojej wypowiedzi wnioskuje, że this.each zaprzecza nieco wieloinstancyjności.
Inaczej mówiąc powiedzmy, że wczytuje objekt:
Zakłądając, że mam dwa formularze na stronie, mogę się spodziewać, że będą ze sobą kolidować. Idąc tym tokiem myślenia, wychodzi, że problem wieloinstancyjności nie powinien występować w przypadku takiego uruchomienia:
![]() -------------------- Wolałem języki z rodziny C ale poszedłem na łatwizne...
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Jak to zaprzecza?
Jeśli w this.each będziesz odnosił się do zmiennej "a" zdefiniowanej poza tą pętlą, to przy ustawianiu będziesz ją nadpisywał lub dopisywał do niej (jeśli to tablica), a przy pobieraniu będzie to wspólna zmienna dla każdej iteracji w this.each. Nie ma tu nic magicznego. Każda iteracja this.each wywołuje funkcję. To tak jakbyś deklarował zmienne lokalne w dwóch osobnych funkcjach, albo jedną zmienną globalną i odwoływał się do niej z tych dwóch funkcji. Co do drugiej kwestii, w takim przypadku, to powinno zapewnić bezkolizyjność. -------------------- |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 22:57 |