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.
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.
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.
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'));
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'));
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.