Wytlumaczenie krótkiej linijki kodu

0

Czesc, chodzi o ten kod.

 var current = ($('#gallery a.show')?  $('#gallery a.show') : $('#gallery a:first')); 

Wiem, ze znak ? oraz : oznaczaja krotszy zapis if i else. Ale nie czaje tego w tym miejscu po prostu.

0

Ja też nie bardzo. Ktos chyba chciał sprawdzić, czy $('#gallery a.show') istnieje, jeżeli tak to chciał przypisać ten obiekt do zmiennej current, a jezeli nie istnieje to chciał przypisać $('#gallery a.show'). Tylko że samo $('#gallery a.show') jeżeli nie istnieje to zwróci [] co daje true, a jeżeli istnieje to tez jest true, więc tak czy siak zostanie wykonane przypisanie var current = $('#gallery a.show');.

Jak już to powinno być:

var current = ($('#gallery a.show').length) ? $('#gallery a.show') :
                                              $('#gallery a:first')); 

Warto w tym miejscu przypomnieć:

The following values are always falsy:
false.
0 (zero)
"" (empty string)
null.
undefined.
NaN (a special Number value meaning Not-a-Number!)

A z tego co wiem typeof czego byś tam w tym selektorze nie dał to object.

0

To znaczy to chyba ma sens bo pozniej jest taka linijka

 var next = ((current.next().length) ? ((current.next().hasClass('caption'))? $('#gallery a:first') :current.next()) : $('#gallery a:first')); 
2

Współczuję pracy z takim kodem....

Niestety operator ? : bywa zdradliwy.

Wg mnie czytelniej byłoby to rozbić na kilka linijek:

// zapamietujemy kontener, wiec nie bedziemy sie powtarzac 10 razy.
// i latwiej bedzie zmienic w przyszlosci
var container = $('#gallery'); 

var links = container.find('a'); 
var show = links.filter('.show');
var current = show.length? show : links.eq(0);

zamiast i tak nie działającego

var current = ($('#gallery a.show')?  $('#gallery a.show') : $('#gallery a:first')); 

http://jsfiddle.net/k6v2LyL6/

2

Luke, jaka jest różnica w zastosowaniu container.find, a $('#gallery a')? -

Choćby DRY: w kodzie, który zastał OP jest w raptem 2 linijkach 5 razy powtórzony selektor #gallery a tu jest raz. Czyli w przypadku zmiany byle zmiany id w 5 (albo więcej) miejscach trzeby było zmieniać (już pomijając to, że stosowanie ID zamiast klas jest dość cienkim pomysłem).

No i w przypadku, kiedy będziemy chcieli mieć 2 czy 5 galerii na stronie, to łatwiej będzie podpiąć logikę interakcji. Wystarczy wydzielić funkcję i podawać jej zmienną container jako argument (zamiast deklarowania przez var). Jedna funkcja obsłuży wiele pojemników.

No i bardziej jest to eleganckie, bo nie szukamy w całej stronie. Jakoś mam awersję do globalnych selektorów, bo w sumie po co jakaś tam funkcja do ustawiania galerii w jakimś konkretnym pojemniku (tutaj: #gallery, ale to może i nawet powinno być względne/nieistotne/łatwe do zmienienia/), ma mieszać na całej stronie? Jeśli w każdej linijce skrypt będzie coś zmieniał albo odwoływał się do czegoś na całej stronie, to trudniej szukać bugów. Np. ktoś niechcący wstawi przecinek: napisze $('#gallery, a') i wszystkie linki na stronie się rozpieprzą.
https://en.wikipedia.org/wiki/Principle_of_least_privilege

A tak to siedzi w pojemniku i zmienia tylko pojemnik / odwołuje się do pojemnika.

No i przypisując kontener do zmiennej możemy potem reużywać zmiennej i teoretycznie może szybciej działać (piszę "teoretycznie" bo w rzeczywistości trzeba byłoby przeprowadzić jakieś testy czy ma to znaczenie i czy faktycznie jest szybciej a nie wolniej). Więc, nie wiem czy to jest bardziej czy mniej wydajne. Ale przynajmniej wydaje się być bardziej eleganckie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1