Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [jQuery] Metoda, która nic nie robi
SmokAnalog
post 15.03.2013, 11:44:22
Post #1





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Witajcie,

czy w jQuery istnieje metoda, która nic nie robi? Śpieszę wyjaśnić o co mi chodzi. Lubię korzystać z mechanizmu łańcuchowania i chciałbym zachować kontekst elementu nawet w sytuacji, kiedy dana metoda może (ale nie musi) być wykonana. Chodzi mi konkretnie o taką sytuację:

[JAVASCRIPT] pobierz, plaintext
  1. $("#element")
  2. .attr("id", "identyfikator")
  3. .addClass("element")
  4. [warunek ? "hide" : "nicNieRob"]()
  5. .appendTo("body")
  6. [warunek ? "fadeIn" : "nicNieRob"]();
[JAVASCRIPT] pobierz, plaintext


Dodaję element do body i w zależności od warunku animacja się odbywa lub nie. Dla pewności, że element nie pojawi się przed płynnym pojawieniem się, ukrywam go. Zamierzony efekt mogę oczywiście łatwo osiągnąć rozbijając kod na cztery części, jednak interesuje mnie bardziej eleganckie rozwiązanie. Co myślicie w ogóle o takiej składni?
Go to the top of the page
+Quote Post
viking
post 15.03.2013, 12:11:34
Post #2





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Metody w jQuery nie wracają nulla ani błędu nawet jeśli element nie istnieje. Plus możesz sobie rozszerzyć na przykład:

Kod
(function($)
{
        $.fn.alwaysTrue = function()
        {

                return true;
        };
})(jQuery);


--------------------
Go to the top of the page
+Quote Post
SmokAnalog
post 15.03.2013, 13:38:17
Post #3





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Nie do końca rozumiem Twoją odpowiedź.

Cytat(viking @ 15.03.2013, 12:11:34 ) *
Metody w jQuery nie wracają nulla ani błędu nawet jeśli element nie istnieje.

Co to ma wspólnego z moim pytaniem?

Cytat(viking @ 15.03.2013, 12:11:34 ) *
Kod
(function($)
{
        $.fn.alwaysTrue = function()
        {

                return true;
        };
})(jQuery);

Chyba return $(this) jeśli już? A poza tym wiem, że mogę sobie rozszerzyć, ale nie chcę grzebać w prototypach i stąd moje pytanie o istniejące puste metody.
Go to the top of the page
+Quote Post
viking
post 15.03.2013, 15:27:38
Post #4





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Ma tyle wspólnego że odpowiada dlaczego tak a nie inaczej działa method chaining w jquery.
http://api.jquery.com/jQuery.noop/
Jeśli chcesz zrobić sprawdzanie ifa w ten sposób i tak musisz rozszerzyć/obejść.


--------------------
Go to the top of the page
+Quote Post
SmokAnalog
post 15.03.2013, 16:44:31
Post #5





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Metoda noop nie działa w kontekście selektorów.

Wcale nie muszę obejść - istnieje składnia, którą pokazałem w pierwszym poście:
[JAVASCRIPT] pobierz, plaintext
  1. obiekt["nazwaMetody"]()
[JAVASCRIPT] pobierz, plaintext


Proszę o odpowiedź osoby, które mają jakieś pojęcie o jQuery.
Go to the top of the page
+Quote Post
Crozin
post 15.03.2013, 17:07:27
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


  1. Powinieneś raczej odejść od swojego pomysłu warunkowego wykonywania metody z wykorzystaniem łańcuchowania. Jest to "niestandardowe" rozwiązanie, więc będzie nieczytelne i nieintuicyjne, w żaden sposób nie wpłynie na szybkość wykonywania kodu, ani Twój czas pracy, a będzie mogło być przyczyną wielu problemów. Co w przypadku gdy zależnie od swojego warunku będziesz chciał przekazać do metody różne argumenty? Co jeżeli będziesz musiał raz wykonać jedną, a raz dwie metody?
    [JAVASCRIPT] pobierz, plaintext
    1. $e = $("element").attr("id", "identyfikator").addClass("element");
    2.  
    3. if (warunek) {
    4. $e.hide();
    5. }
    6.  
    7. $e.appendTo("body");
    8.  
    9. if (warunek) {
    10. $e.fadeIn();
    11. }
    [JAVASCRIPT] pobierz, plaintext
    Kod jest dłuższy? Tak, ale co z tego, skoro jest dużo łatwiejszy w czytaniu/utrzymaniu.
  2. Jeżeli jednak uparłbyś się przy swoim rozwiązaniu, musiałbyś samemu utworzyć taką metodę - nie wiem dlaczego nie chcesz "grzebać w prototypach". Jak sam zauważyłeś, metoda taka musiałaby zwracać referencję do this (nie ma potrzeby opakowywania tego ponownie w obiekt jQuery).
Go to the top of the page
+Quote Post
SmokAnalog
post 15.03.2013, 19:23:48
Post #7





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Nie mam aż takiego ciśnienia na łańcuchowanie i też zastanawiałem się czy w tym przypadku to na pewno najlepsze wyjście. Wymyśliłem trochę inne obejście problemu - z wykorzystaniem metody first(), last() itd. Są one nieco mylące w tym kontekście i rzeczywiście kod robi się trochę nieczytelny.

To, co zaproponowałeś, to wspomniany przeze mnie podział na cztery części i przy braku "pustej" metody zostanę przy tym rozwiązaniu. Czy taka kolejność wykonywania: ukrycie - dodanie do DOM - fadeIn, jest jedyną w tym przypadku zalecaną kolejnością? Czy wywołanie najpierw fadeIn, a potem append może spowodować efekt pojawienia się elementu, gdy ten jest w trakcie animacji? To takie pytanie raczej do dyskusji, sam zawsze dbam o logiczną kolejność wykonywania.
Go to the top of the page
+Quote Post
Crozin
post 15.03.2013, 20:12:24
Post #8





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat
Czy taka kolejność wykonywania: ukrycie - dodanie do DOM - fadeIn, jest jedyną w tym przypadku zalecaną kolejnością? Czy wywołanie najpierw fadeIn, a potem append może spowodować efekt pojawienia się elementu, gdy ten jest w trakcie animacji?
Tak i tak. Wyświetlanie elementu w oknie przeglądarki i działanie JS są realizowane w osobnych wątkach dlatego należy pilnować się w kolejności kodu. Innymi słowy, przeglądarka może rozpocząć renderowanie fragmentu strony nim zdążą wykonać się wszystkie Twoje operacje w JS.
[JAVASCRIPT] pobierz, plaintext
  1. $("<p>test</p>").hide().appendTo("body").fadeIn(); // zagwarantuje dodanie ukrytego elementu do DOMu i jego rozwinięcie
  2. $("<p>test</p>").appendTo("body").hide().fadeIn(); // może skutkować "mignięciem" elementu na ekranie przed jego ukryciem i ponownym rozwinięciem
[JAVASCRIPT] pobierz, plaintext


Ten post edytował Crozin 15.03.2013, 20:17:28
Go to the top of the page
+Quote Post
viking
post 15.03.2013, 20:13:25
Post #9





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Tylko naprawdę dlaczego nie chcesz rozszerzyć? Jest to zgrabne wyjście żeby zachować obiekty, zarazem dając czytelną na przyszłość i przenośną składnię.


--------------------
Go to the top of the page
+Quote Post
SmokAnalog
post 15.03.2013, 20:49:08
Post #10





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Czytelną na przyszłość i przenośną? No chyba jednak nie do końca, rozszerzanie jakiegokolwiek prototypu jest ryzykowne - nie wiesz co się pojawi w kolejnych wersjach. Z praktycznego punktu widzenia szkodliwość takiego działania jest oczywiście dość niewielka, jednak uważam to za nieeleganckie rozwiązanie. Już lepiej posłużyć się wzorcem dekoratora.

Ten post edytował SmokAnalog 15.03.2013, 20:49:42
Go to the top of the page
+Quote Post
viking
post 16.03.2013, 07:21:00
Post #11





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


No wiesz, ale jeżeli tak podchodzimy do sprawy to racji bytu nie miały by wszystkie wtyczki jQuery (a tych jak wiesz trochę jednak powstało). Tym bardziej że do tego zadania nie potrzebujesz super wymyślnych operacji tylko parę linijek kodu.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 1.07.2025 - 16:56