Autor | Zpráva | ||
---|---|---|---|
moom Profil |
#1 · Zasláno: 29. 2. 2012, 00:34:28
Lidi zlatí, mám prosím dotaz. Už se snažím dvě hodiny vymyslet jQuery pro filtrování zobrazení DIV elementů na stránce. Mám asi 100 DIV elementů které mají třídu: fix, propiska, roller podle svého obsahu. No a já jsem si nad ně přidal seznam, s tlačítky Zobrazit jen: Fixky, Propisky, Rollery. Což vyfiltruje jenom DIV elementy s danou třídou. Vše funguje jenom při prvním vyfiltrování. Všechny produkty mají CSS třídu display: none; Takže když načtu stránku není nic vidět. Když kliknu na odkaz "fixky" tak se mně zobrazí jenom fixky, ale když kliknu na "propisky" tak se mně zobrazí i rollery, ale už se neschovají Fixky. No a to bych chtěl ještě přidat tlačítko zobrazit vše.
Odkazy mám tyto: <ul> <li> <a href="#" class="fixky">Fixy</a> </li> <li> <a href="#" class="propisky">Propisky</a> </li> <li> <a href="#" class="vse">Vše</a> </li> </ul> A v jQuery toto: $(document).ready(function() { $('.fixky').click(function () { $('.fix').animate({ opacity : 'toggle' }, 'slow'); }); $('.propisky').click(function () { $('.propiska').animate({ opacity : 'toggle' }, 'slow'); }); }); Ještě mě napadlo toto řešení, které řeší schování ostatních produktů, ale zase mně nefunguje pro zobrazení všeho: $('.fixky').click(function () { $('.fix').show(); $('.propiska').hide(); $('.produkt').hide(); }); $('.propisky').click(function () { $('.propiska').show(); $('.fix').hide(); $('.produkt').hide(); }); $('.vse').click(function () { $('.produkt').show(); }); |
||
weroro Profil |
A musí to byť v jQuery? Ak nie, tak tu som si našiel chvíľku:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title> </title> <style> .fix{height:30px;background-color:#00ff00;} .propisky{height:30px;background-color:#0000ff;} .roller{height:30px;background-color:#ff0000;} .fix,.propisky,.roller{display:none;border-style:solid;border-width:1px;} ul li{display:inline;} </style> <script> var temp = null; var sw = false; function swDIV(cls) { if (cls == 'all') { var ha = document.getElementById(cls).getElementsByTagName('div'); temp = null; //sw = (sw) ? false : true; sw = !sw; for (i = 0; i < ha.length; i++) ha[i].style.display = (sw) ? "block" : "none"; return; } sw = false; var el = document.getElementsByClassName(cls)[0].parentNode.getElementsByTagName('div'); for (i = 0; i < el.length; i++) el[i].style.display = "none"; el = []; el = document.getElementsByClassName(cls); for (i = 0; i < el.length; i++) el[i].style.display = "block"; el = []; el = document.getElementsByClassName(temp); temp = (temp == cls) ? null : cls; for (i = 0; i < el.length; i++) el[i].style.display = "none"; } </script> </head> <body> <ul> <li> <a href="#" onclick='swDIV("fix")'>Fixy</a> </li> <li> <a href="#" onclick='swDIV("propisky")'>Propisky</a> </li> <li> <a href="#" onclick='swDIV("roller")'>Roller</a> </li> <li> <a href="#" onclick='swDIV("all")'>Vše</a> </li> </ul> <div id='all'> <div class='fix'></div> <div class='propisky'></div> <div class='roller'></div> <div class='fix'></div> <div class='propisky'></div> <div class='roller'></div> <div class='fix'></div> <div class='propisky'></div> <div class='roller'></div> <div class='fix'></div> </div> </body> </html> |
||
Chamurappi Profil |
Reaguji na werora:
Metoda getElementsByClassName nefunguje ve všech prohlížečích.
Proč přiřazuješ do el prázdné pole?
Nikde nedeklaruješ proměnnou i .
Reaguji na mooma: Měň při změně výběru třídu na společném rodičovi a zbytek vyřeš v CSS. |
||
moom Profil |
#4 · Zasláno: 29. 2. 2012, 09:36:48
Paráda, super, děkuji. Funguje to. Ale vůbec už nerozumím jak :)
Já umím jenom CSS, HTML a teď jsem se začal učit základy jQuery ale samotný JavaScript nezvládám. Zatím se pohybuji na úrovni výběru různých elementů, schovávání a animaci, vytvoření proměnné, ale uvedenému řešení moc nerozumím, že vůbec netuším co v uvedeném funkčním řešení co co znamená. No nic, jdu ještě najít co znamená :) i = 0, ==, ++, sw = !sw, i++ |
||
_es Profil |
moom:
> teď jsem se začal učit základy jQuery > ale samotný JavaScript nezvládám To ale treba postupovať naopak. JQuery je len jedna funkcia/objekt a bez znalosti základov JS ti bude skoro na nič. > No nic, jdu ještě najít co znamená :) > i = 0, ==, ++, sw = !sw, i++ Viď základy JS, napríklad tu. |
||
moom Profil |
#6 · Zasláno: 29. 2. 2012, 09:55:25 · Upravil/a: Moderátor (editace znemožněna) 29. 2. 2012, 13:25:37
Chamurappi: ha... kurňa, dobré popokopnutí
Pokud rozumím správně, tak bych mohl přidávat třídu: $('.propiska').click(function () { $('.sortiment').addClass('propisky'); }); a v css nastylovat, že když má DIV 'sortiment' přidanou třídu 'propisky' tak se nezobrazují třeba 'rollery' Hmm... To mě nenapadlo, děkuji :) Ještě jsem nakonec udělal toto, kde prvně schovám co nepotřebuji, a na konec zobrazím co potebuji. No a abych jQuery nemuselo furt procházet DOM, tak jsem přidal proměnné. Jenom netuším, jestli musí být nějak oddělené, ale světě div se, funguje to taky: var fix = $('.fix') var produkt = $('.produkt') var propiska = $('.propiska') $('.fixky').click(function () { produkt.hide(); propiska.hide(); fix.fadeIn(400); }); $('.propisky').click(function () { produkt.hide(); fix.hide(); propiska.fadeIn(400); }); $('.vse').click(function () { produkt.fadeIn(400); }); _es: Máte pravdu... jsem knedla, ale jsem i grafik a tak JS je pro mě moc složité a přestože jQuery je JS, tak mně pro občasné využití různých efektů a vychytávek připadne jQuery užitečné. Něco málo jsem už pochytil, viz předcházející příspěvek :) na který jsem trošku pyšný :) No vlastně je možná každé řešení špatné, protože je to asi 100 produktů. A možná by bylo lepší využít nějakou funkci ve smyslu načtení stránky, nebo určitého elementu do již hotové stránky. Na tutsplus jsem viděl návod s využitím jQuery: (function() { var wrap = $('div.wrap'); $('a').on('click', function( e ) { var href = $(this).attr('href'); wrap.load( href + ' .container' ); e.preventDefault(); }); })(); |
||
_es Profil |
moom:
„jsem přidal proměnné“ Na oddeľovanie príkazov je dobré používať vždy bodkočiarku. V jednom príkaze var sa môže definovať aj viac premenných: https://developer.mozilla.org/en/JavaScript/Reference/Statements/var
|
||
moom Profil |
#8 · Zasláno: 29. 2. 2012, 11:06:56
_es:
Mohu se prosím zeptat ještě na jednu otázku. Je tedy pravda, že je lepší dělat proměnné, aby JS nemusel znovu a znovu procházet DOM, tedy aspoň tak jsem to pochopil, že je to výhodné... |
||
_es Profil |
#9 · Zasláno: 29. 2. 2012, 11:43:54
moom:
V premennej je len odkaz na objekt, teda je dobré ich vhodne využiť. Neustále vyhľadávanie prvkov v DOM je výpočtovo náročné. |
||
weroro Profil |
„Metoda getElementsByClassName nefunguje ve všech prohlížečích.“
To som nevedel. Ako sa potom pracuje s elementami, ktoré majú priradené class? Chamurappi: „Proč přiřazuješ do el prázdné pole?“ Pretože el napĺňam vopred neznámym počtom prvkov, a keďže ho ďalej prepisujem ďalším neznámym počtom prvkov môže sa stať, že prvý krát bude v el 11 prvkov a budem ho chcieť prepísať 6 prvkami. Ale legth mi stále vráti dĺžku 11 a el bude obsahovať od 7 pozície aj tie staré prvky. Preto el najprv vymazávam. (Alebo to takto v JS nefunguje, pardom v AS to pôsobí veľké problémy, tak to automaticky robím všade) „Nikde nedeklaruješ proměnnou i.“ To som si uvedomil, keď som sa ráno zobudil. Vždy deklarujem, akurát teraz som na to pozabudol. |
||
moom Profil |
#11 · Zasláno: 29. 2. 2012, 12:35:27
Paráda, super, každý se něco přiučí :)
|
||
Chamurappi Profil |
#12 · Zasláno: 29. 2. 2012, 13:44:15
Reaguji na werora:
„Ako sa potom pracuje s elementami, ktoré majú priradené class?“ To prakticky nikdy není potřeba. Pokud je, tak se musí cyklem projít všechny elementy a individuálně ověřit jejich třída. „Pretože el napĺňam vopred neznámym počtom prvkov“ To není tak úplně pravda. Metody DOMu většinou nevrací skutečné pole, ale HTML kolekci — která je takzvaně živá. Reálně to znamená, že do el se nedostanou nalezené elementy, ale universální trpaslík, který sice ví, co tě zajímá, ale začne makat až v okamžiku, kdy se zeptáš na něco konkrétního. Zeptáš-li se na length , prohledá DOM, spočítá nalezené a to ti řekne. Zeptáš-li se na pátou položku kolekce, začne prohledávat DOM, odpočítá si raz, dva, tři, čtyři, pět a pátý výskyt ti předá…
|
||
Časová prodleva: 11 let
|
0