Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [jQuery] Metoda, która nic nie robi
Forum PHP.pl > Forum > Po stronie przeglądarki
SmokAnalog
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?
viking
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);
SmokAnalog
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.
viking
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ść.
SmokAnalog
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.
Crozin
  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).
SmokAnalog
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.
Crozin
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
viking
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ę.
SmokAnalog
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.
viking
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.