Starší komentáře ke článku: Seřazení tabulky JavaScriptem snadno a rychle
Zpět na článek | Úvodní stránka Interval.cz
Datum vložení: 20.5.2004 9:01:56
Velice uzitecne, skoda toho IE5 ale pro datagridy v intranetu nebo admin rozhrani velice pekne a rychle bez nutnosti refreshe stranky a zatezovani databaze.
Datum vložení: 20.5.2004 10:18:23
Jak se to chova v prohlizecich, ktere to nepodporuji?
Hlasi nejakou chybu nebo u nich to razeni proste jen nefunguje?
Datum vložení: 20.5.2004 11:45:43
Clanek vznikal pomerne hekticky, takze skript neni uplne idealni. Tak jak ted je bude hlasit chybu pokud prohlizec nezna localeCompare (samozrejme i metody DOM, ale to uz je zivot :-). To se samozrejme da osetrit. Trochu horsi je to, ze Opera localeCompare zna, ale tridi spatne - necesky. Tam by bylo potreba udelat test - kratke pole s problematickymi znaky, seradit pres localeCompare a porovnat s ocekavanym vysledkem.
Jinak v JavaScriptu jde uplne oddelit kod od html kodu stranky - v tomto prikladu je jeste v kazde bunce zahlavi napsano
onclick = "serad(neco,neco)"
ale slo by to dat i do JavaScriptu, takze byste mel cisty HTML kod, veskery JavaScript v externim souboru a tomu, kdo ma prohlizes s jeho podporou se bude tabulka tridit, ostatnim ne a nebude se jim stahovat nic zbytecne.
Leos Ondra
Datum vložení: 20.5.2004 10:32:55
Super, hlavně to, že používá DOM a ne ty innerHTML aspol. jako ten druhý článek...
Datum vložení: 20.5.2004 15:17:52
Doporucuji podivat se na oba dva clanky a srovnat zdrojaky. Je krasne videt jak elegantni dokaze byt DOM.
Datum vložení: 20.5.2004 17:28:26
Dobrý den,
to je nádherně elegantní řešení. Mohu se zeptat na licenci pod kterou autor kód uvolnil?
F
Datum vložení: 20.5.2004 18:25:24
Všechny články Interval.cz jsou chráněny autorským zákonem, a to jak naším, tak i mezinárodním. Kódy pravděpodobně v brzké době převedeme na Creative Common, konkrétní znění ale ještě nemáme připraveno.
Datum vložení: 20.5.2004 18:28:38
A co to konkretne znamena pro toho, kdo by kod chtel pouzivat v JavaScriptu na svych strankach? :-)
Leos Ondra
Datum vložení: 20.5.2004 18:39:39
Až dosud se tiše předpokládalo, že zveřejněním autor automaticky poskytuje svolení k volnému užití skriptů (nikoli článkových textů), nebylo to však nikde kodifikováno, protože autorský zákon o tomto problému nehovoří. Od toho je zde právě Creative Common licence - ta zachovává autorská práva a zároveň umožňuje skript dále používat a zdokonalovat. Předpokládáme, že ve výsledné verzi budou uchována autorská práva dle autorského zákona s tím, že čtenář může dále pracovat se skripty, pokud v nich ponechá informaci o zdroji a původním autorovi.
Datum vložení: 21.5.2004 10:12:45
Děkuji za informace. Doufám že přechod na otevřenou licenci budou provázet dostatečné famfáry, například v poddobě samostatného článku.
Hezký den
Datum vložení: 21.5.2004 10:19:37
Nevím, proč by toto měly doprovázet fanfáry. O aktuálním dění informuji, jak je zvykem, v editorialech, čili stačí je číst a budete v obraze ;-)
Datum vložení: 21.5.2004 10:34:56
Nejak z toho ovsem porad nechapu stavajici stav. Z me strany jakozto autora neni zadny problem - kod jsem publikoval aby se zcela volne pouzival, ale publikoval jsem ho prostrednictvim Intervalu.
Takze jeste jednou - v tuto chvili, bez nejakych Commons :-) si muze kazdy, pokud chce, tento kod pouzit zcela volne na svych strankach, zatimco po uprave podminek bude muset uvest autora a zdroj (Interval). Chapu to dobre? Leo
Datum vložení: 21.5.2004 11:19:54
V tuto chvíli kód spadá pod autorský zákon stejně jako článek a jeho použití kdekoli mimo něj (v rozsahu přesahujícím povolenou citaci) je porušením tohoto zákona. Interval.cz chce změnit tento právní stav, který je v rozporu s jeho statutem a posláním, aby kdokoli mohl kódy používat volně. A k tomu právě poslouží Creative Common licence ;-)
Datum vložení: 21.5.2004 11:26:42
Jinak receno publikovat ted jakykoliv konkretni kod na Intervalu je vlastne nesmysl, protoze ho striktne vzato nikdo nemuze pouzit. Hmmmm... :-(
Leos Ondra
Datum vložení: 21.5.2004 11:34:00
No, nesmysl to není. Několikrát se již stalo, že někdo "přetiskl" náš kompletní článek, že ho vydával za své dílo (aféra s diplomkami na VŠE) nebo článek "přepsal" - v těchto případech jsme postupovali ve shodě s autorským zákonem a vymáhali práva magazínu i autora. V případě použití kódů tak ale nehodláme činit. Problém je pouze v tom, že se tak dostáváme do paradoxní situace, kdy my sami odporujeme zákonům pouhou svou existencí. Na rozdíl od ostatních se s tím ale snažíme něco dělat ;-)
Datum vložení: 21.5.2004 11:39:35
Tak to je pristup ktery chapu a uklidnil me :-)
Leos Ondra
Datum vložení: 20.5.2004 21:19:44
Testoval jsem ted zbezne rychlost obou zpusobu trideni pro delsi tabulky, konkretne 110 radku (deset kopii me puvodni ukazkove za sebou) - uvnitr tridici fce (v mem pripade serad(), u pana Ruzicky ts_resortTable()) se na zacatku zjisti cas, na jejim konci se stopky zastavi. Tedy od kliknuti na hlacicku po setrideni:
IE6:
serad: 180 az 290 milisekund
ts_resortTable: 2700 az 3300 milisekund
Mozilla 1.6
serad: 140 (cisla) az 220 milisekund
ts_resortTable: 3500 (cisla) az 8600 milisekund
Opera (uvadim jen pro zajimavost, muj skript netridi dobre cesky):
serad: 40 (cisla) az 70 milisekund
ts_resortTable: 600 (cisla) az 1600 milisekund
Manipulovat primo s uzly v dokumentu se nevyplaci :-)
Leos Ondra
Datum vložení: 21.5.2004 15:28:57
Tak jsme to zkoušel ve IE, Opeře a Firefoxu. Skriptík je to pěkný, leč ve Firefoxu to nejede. Nevím proč. Vypadá to na chybu Firefoxu.
Prosím poraďte mi, jestli nedělám něco špatně.
Dík Tm@J
Datum vložení: 21.5.2004 17:17:20
Dekuji za test. Musim si Firefox nainstalovat a vyzkouset v kterem kroku muze byt chyba. Jinak jsem uz udelal ceske trideni i pro prohlizece, ktere neumi localeCompare ale umi ostatni metody DOM (IE5, Opera), po dohode s redakci pripadne dozverejnim :-) Leo
Datum vložení: 21.5.2004 17:24:47
Hotovo - me to v nem jede, bez potizi. Mate zapnuty JavaScript? :-) Leo
Datum vložení: 21.5.2004 20:29:05
Javascript byl zapnutý. To bylo to první, co jsme kontroloval. Zkusil jsme to znovu asi po hodině a už to jde. Prostě neměl Firefox svůj den.
Dík za reakci a hodně zdaru v další práci
Tm@J
Datum vložení: 21.5.2004 21:09:19
...je to spis takova hracka. V praxi jsou tabulkove vypisy totiz vetsinou strankovane - takze setrideni podle dat v jedne "strance" vypisu neni k nicemu. A predstava, ze se vsechna data z nejake DB tabulky naflakaji do 1 HTML tabulky a poslou na klienta, je dost nerealna - nehlede na to ze vetsina datove velikosti takove tabulky je zabrana z hlediska zdrojovych dat redundantnim HTML kodem.
Jedina cesta, jak strankovane vypisy a jejich razeni dostat na klienta, je XML + XSLT. Samozrejme, podpora v prohlizecich je mensi (IE 6 + Gecko) a tabulku s milionem radku do prohlizece nacpat stejne nemuzete, ale dostanete se o krok dale...
Datum vložení: 21.5.2004 23:13:28
"Jedina cesta, jak strankovane vypisy a jejich razeni dostat na klienta, je XML + XSLT. Samozrejme, podpora v prohlizecich je mensi (IE 6 + Gecko) a tabulku s milionem radku do prohlizece nacpat stejne nemuzete, ale dostanete se o krok dale..."
Dalsi cesta jak dostat strankovane vypisy a jejich razeni na klienta je JavaScript a DOM :-) A narozdil od XML to neni zdaleka omezene na IE6 a Gecko... Leo
Datum vložení: 22.5.2004 1:13:36
Asi takhle - ano, jde to jen s prostredky JS/DOM (btw. pouziti XML/XSLT samozrejme implikuje obsluhu pres JS/DOM). Samozrejme, lze treba vsecky data nacpat do JS pole a tabulku sestavovat dynamicky. Samozrejme, ze je mozne cely HTML kod tabulky vytvaret prostredky DOMu.
Nicmene pouziti XML dat a XSLT sablony je elegantnejsi metoda, protoze presne odpovida charakteru transformace - sablona se "naleva" daty. Cim vice s tim budu pracovat, tim praktictejsi a mene pracne to bude.
A k te kompatibilite - IE6 a Gecko je min. 80% uzivatelu. At uz to budu delat pres XSLT, nebo jen DOMem, stejne musim udelat klasickou "serverovou" verzi. Takze v tomto bode me netrapi, jestli je to 80% (to cislo navic porad poroste), nebo 95%. Navic, pokud budu mit chut, muzu osetrit i XSL verzi, cimz funkcnost rozsirim i na IE5 a 5.5 - a razem jsem na temer stejnem pokryti, jako pri pouziti pouze JS/DOM.
Je to podobne, jako pri dynamickem vytvareni webove stranky na serveru - samozrejme, ze mohu (X)HTML kod stranky sestavovat "objektove", napr. pres XML DOM v PHP. Ale v praxi radsi vyuziju nejaky system zalozeny na sablonach, protoze se s tim pracuje jednoduseji a rychleji.
Datum vložení: 22.5.2004 9:37:46
Ve své úvaze se dopouštíte jedné podstatné chyby, neberete totiž v úvahu účel skriptu, který kritizujete. Je to chyba běžná, o to však nebezpečnější.
Tvrdíte, že argumentem proti tomuto skriptu je, že v praxi jsou většinou tabulkové výpisy stránkovány. Jakkoli mohu o tomto argumentu pochybovat, nebudu s ním polemizovat, protože je naprosto irelevantní. Popisovaný skript je totiž určen k nasazení jako doplněk zobrazovaných tabulek ke zvýšení uživatelského konfortu, přičemž je jedno, jestli se na stránce zobrazí tabulka celá nebo její část.
Myslím, že většina čtenářů ocení, když si bude moci tabulku v článku seřadit podle vybraného sloupce, umožní jim to prezentované informace lépe uchopit a přijmout. Já sám používám skript kolegy Růžičky v redakčním systému, kde mi poskytuje neocenitelné služby, bez ohledu na to, zda si řadím nestránkovanou tabulku s výpisem seriálů, nebo stránkovanou tabulku s články ;-)
Datum vložení: 22.5.2004 9:56:59
Nehlede na to, ze krome trideni cele tabulky umoznuje JavaScript na strane klienta pres DOM treba i presunovat rucne jednotlive radky - sikovne pokud mate treba administraci internetoveho obchodu a chcete zmenit poradi polozek a toto neni dane zadnym abecednim nebo ciselnym poradkem. Skripty na zmenu poradi radku v tabulce jsou urcene prave k tomuto - pridana hodnota prace s tabulkou, kterou uz tak jako tak vypsal (X)HTML. Leo
Datum vložení: 22.5.2004 14:43:46
Ja dobre vim, co JS/DOM umi - ja ale spis uvazuju, k cemu se co hodi a nehodi, pokud porovnam ruzna reseni postavena na ruznych technologiich implementovanych v prohlizecich.
Datum vložení: 22.5.2004 14:38:37
Asi jste si nevsiml, pane sefredaktore, co pisu hned v subjektu - nevadi, pripomenu: "Hezke, ale prece jen...". Muj prispevek nemel za ucel kritizovat tento skript - ten je docela v poradku. Mel poukazat na neco, co tento skript uplne neresi - tj. to ze vetsinou potrebuji radit vsechny zaznamy ale vypisovat pouze cast zaznamu. A ukazat na jine reseni, kterym se takove veci (se kterymi se v praxi setkavam casteji) daji delat dle meho soudu vyhodneji.
To jestli ctenari oceni, nebo neoceni skript popisovany v clanku, je z hlediska smyslu meho prispevku zcela irelevantni, tedy dle meho (ne)skromneho nazoru.
Datum vložení: 22.5.2004 14:43:06
Opravte me jestli se mylim, ale pokud chcete seradit vsechny zaznamy, musite je mit vsechny k dispozici. A pokud tedy budete serazovat na klientovi, musite je tam vsechny poslat, at uz vcelku nebo po castech. Nejak jsem prestal chapat co se tady resi...
Datum vložení: 22.5.2004 14:50:01
Presne tak. Cim je tech zaznamu vice a cim vetsi kejkle potrebuju pri zobrazovani dat provadet, tim je pro mne vyhodnejsi mit data oddelena od zobrazovaci formy. A to je presne XML transformovane XSLT sablonou - o obsluhu uzivatelskych akci a vymenu kodu se pak stara JS/DOM. Napr. si predstav, ze chces, aby si uzivatel mohl zamenit radky a sloupce tabulky. Podle mne je o dost jednodussi na to napsat dalsi XSLT sablonu nez dalsi DOM skript.
Datum vložení: 22.5.2004 14:56:55
Pro natazeni XML JavaScriptem ale potrebuju mit povoleny ActiveX (v IE). Nebo ne? Leo
Datum vložení: 22.5.2004 15:09:18
No a? Pro zobrazeni Flashe potrebuju mit taky zaple ActiveX v IE a neni to duvod pro nenasazeni Flashe.
Datum vložení: 22.5.2004 15:10:23
No pro me je dalsi a navic neprijatelna technologie... Leo
Datum vložení: 22.5.2004 15:27:58
Flash nebo ActiveX?
O Flashi diskuse neni, to byl priklad ktery mel ukazat, jak asi v praxi ovlivnuji uzivatele, kteri si vypnou ActiveX, moznosti nasazeni technologii, ktere se na ActiveX v IE vazou (dle meho nazoru je to naprosto zanedbatelne procento uzivatelu).
A jestli je pro tebe neprijatelna technologie ActiveX, tak tim konci veskera diskuse, protoze nasledna diskuse by byla a) na jine tema, b) fundamentalisticka. A na to ted nemam chut:-)
Datum vložení: 22.5.2004 18:25:20
ActiveX. Leo
Datum vložení: 22.5.2004 16:02:51
Článek pojednává o skriptu, který umožňuje řadit údaje ve standardní (X)HTML tabulce podle abecedy. Není to článek o tom, jak skriptovat stránkování rozsáhlých tabulek a je řadit. Od ledničky asi také nebudete požadovat, aby vám kuře rovnou i opekla. Vaše připomínky jsou tedy naprosto irelevantní a jejich neustálým nesmyslným opakováním pouze dokazujete svou ignoranci a neschopnost vyjadřovat se k věci.
Datum vložení: 22.5.2004 16:40:11
...a taky nemam chut odpovidat na osobni invektivy, ktere nastupuji tehdy, kdyz nekdo nema vecne argumenty a mysli si, ze jedine on urcuje, na jaka temata se smi diskutovat pod clanky. Takze sbohem.
Datum vložení: 25.5.2004 17:49:09
Fuguje to fakt rychle, používám dávno ten druhý script, který, když je tam třeba přes tisíc buněk, je však téměř nepoužitelný. Tenhle je super, díky, Leo.
Ovšem problém je, když sloupce obsahují tagy - např.: <a href="mailto:..." atd.
Datum vložení: 25.5.2004 17:59:39
Diky. To s tim netextovym obsahem bunek by samozrejme slo osetrit, ve volne chvili dopisu a postnu sem, proste se projde cely podstrom te bunky a textove uzly slepi dohromady, tvorim neco takoveho v ramci jineho vetsiho projektu. Leo
Datum vložení: 26.5.2004 18:03:35
Jenom bych si dovolit doplnit tuto opravdu uzitecnou vec jeste o jedno vylepseni. Pokud se vam stane, ze v bunce bude prazdna hodnota <td></td>, script nebude fungovat. Pritom staci pomerne jednoducha uprava pri naplnovani virtulani tabulky
...
for (var j=0;j<pocetsloupcu;j++) {
//V pripade, ze je pole prazdne dosad do pole prazdnou hodnotu
if (bunky[j].firstChild == null){
udaje[i][j+1] = 'ZZZZZZZZZZ';
}
else{
udaje[i][j+1] = bunky[j].firstChild.data;
}
}
Pred naplnenim se zeptam, zda je nejaka hodnota. Pokud neni (coz poznam tak, ze mi metoda firstChild vrati hodnotu null), tak do daneho pole virtulan tabulky podstracim rezetec 'ZZZZZZZZZZ' - a to proto, ze prazdnou hodnotu chi radit na konec abecedy. Zkousel jsme jeste 'ŽŽŽŽŽŽŽŽŽŽŽ', ale bohužel Javascript řadí 'Ž' na začátek abecedy (kdysi jsme se s tím setkal u Microsoft Access, nevím, proč tot tak je). Samozřejmě by asi bylo ještě moudré otestovat, zda v poli je číslo nebo řetezec (pošle se na kliklnutí na sloupec, podle toho, co si autor nastaví), pak by místo tohoto tam asi patřilo '9999999999'.
Nebo má někdo lepší nápad...?
Datum vložení: 26.5.2004 18:11:34
Dekuji za upozorneni, ale melo by stacit do prazdne bunky dat nedelitelnou mezeru  
Leo
Datum vložení: 26.5.2004 18:44:44
Lepší nápad mají přímo pravidla - prázdná buňka se vyskytnout prostě nesmí ;-)
Datum vložení: 26.5.2004 19:21:23
Jaká pravidla...?
Datum vložení: 26.5.2004 19:41:06
Standardy W3C pro (X)HTML ;-)
Datum vložení: 26.5.2004 19:47:25
Neřekl bych.
<a href='http://www.w3.org/TR/html4/struct/tables.html#h-11.2.6' target='_blank'>http://www.w3.org/TR/html4/struct/tables.html#h-11.2.6</a>
po chvíli se dočtete, že: "Cells may be empty (i.e., contain no data)."
Datum vložení: 26.5.2004 20:52:50
<TABLE border="1">
Ad: Neřekl bych
<TR><TD>1 <TD rowspan="2">2 <TD>3
<TR><TD>4 <TD>6
<TR><TD>7 <TD>8 <TD>9
</TABLE>
Dovolím si poznamenat, nemyslíte tím buňku, kterýá je přetažena přes řádek? Viz nahoře.
prázdná buňka je ta, která neobsahuje data a pak tedy nemá smysl. Jakou funkci by asi plnila? Někdy se používá jako "oslí" můstek, ale to W3C nepřipouští!
Datum vložení: 27.5.2004 8:09:14
Jakou funkci by plnila? že by tam data mohla být, ale nejsou k dispozici, například když je tabulka plněna daty z formuláře a zadavatelka nechce uvést datum narození.
Datum vložení: 27.5.2004 10:19:18
Souhlas, jsou to proste chybejici data - prakticky v kazde tabulce v praxi, kterou jsem videl (a nemyslim html tabulky na webu) byla nejaka prazdna bunka. Leo
Datum vložení: 27.5.2004 19:19:28
Musím říci, že jsem si dovolil využít tuto šikovnou věcičku pro svoje nejenom osobní použití (ale nakonec se k zákazníkovi stejně nedostane neb by mi její implmenetace přinesla problémy někde jinde), a právě v praktickém případě jsem přišel na to, že u prázdné buňky to zkolabuje. Tím praktickým příkladem byl číselník automobilů v aplikaci 'Cestovní příkazy'. Ten číselník obsahuje SPZ, Typ auta, vlastníka auta, palivo. S tím, že palivo je pouze doplňující a tudíž nepovinná informace. Pochopitelně tabulku plním z databáze. Jistě mohl by si ohlídat prázdné XML tagy, ale kdybych měl hlídat takové s odpuštěním prkotiny, tak budu za chvíli jako SAP - 5 let žádná doba :-)
Uznávám standardy, ale zase na druhou stranu odsud potud...ale je to jistě záležitost každého programátora. Mě často dost tlačí čas...:-))
Datum vložení: 27.5.2004 19:25:33
Da-li panbu a cas, tak postupne skript doplnim a osetrim ruzne varianty, ale tezko rict kdy. Leo
Datum vložení: 27.5.2004 22:46:26
Bacha, ať to Leo neslyší! :-) Pokud byste to náhodou používali pouze pro IE třeba v intranetu, lze nahradit firstChild.data za innerText a je po problémech.
Datum vložení: 27.5.2004 23:06:50
Nebo - pro vsechny prohlizece s podporou DOM pridat do kodu
function _getText(e) {
var p = e.childNodes;
var k = p.length;
var t = "";
for (var i=0;i<k;i++) t += (p[i].nodeType=="3") ? p[i].data : _getText(p[i]);
return t;
}
Funkce vraci pro dany element (e) textovy obsah, i kdyz jsou tam dalsi vnorene elementy a resi - jak se zda - i prazdne bunky. Pak je potreba do puvodniho kodu misto
udaje[i][j+1] = bunky[j].firstChild.data;
napsat
udaje[i][j+1] = _getText(bunky[j]);
Leo
Datum vložení: 28.5.2004 0:05:34
Dík, nemá to chybu, je to neuvěřitelně rychlé i při velkých objemech dat.
Datum vložení: 28.5.2004 0:33:07
Chybu to jeste ma - ruzny prohlizece zachazi ruzne s pripadem kdyz ve zdrojaku HTML je uvnitr bunky zlom radku - konkretne Opera s tim ma potize. Takze jeste chvili ladeni :-) Ale uz mam i cestinu pro vsechny prohlizece, a ta 110 radkova tabulka se v Opere tridi cca 300 milisekund. Leo
Datum vložení: 28.5.2004 7:18:49
Tak jsem zkoušel tabulku o 3000 řádcích a třech sloupcích, tento script ji seřadil za necelé 4 sekundy,
ten druhý script asi po deseti vteřinách ohlásil, že script na této stránce způsobuje, že aplikace IE pracuje pomalu a může se stát, že počítač přestane odpovídat. Starý srcipt používám asi na stořádkovou tabulku, tam mu to trvá asi půl minuty, a kdo neví o co jde, tak na to čekat nebude.
Datum vložení: 6.6.2005 3:31:28
Nešlo by se nějak dohodnout na poskytnutí tohoto (Vámi upraveného) scriptu ? Mám známého, který by chtěl udělat nějakou databázi na Web. Je tam asi 2500 položek a tohle by bylo přesně to co potřebuje. Ještě, kdyby mi tak někdo pomohl s tím, jak to z DBF IV převést na tuhle SUPER tabulku. Nevím jak by to bylo drahé, ale silně uvažuji o tom, že bych si to někým nechal zpracovat, než "vymejšlet již vymyšlené", a dělat to 150-ti převodama. Děkuji předem za rozumný návrh ... ;-)
Datum vložení: 27.5.2004 20:05:09
Použijte skript ze sesterského článku, ten je proti podobným chybám "zodolněn" ;-)
Datum vložení: 28.5.2004 8:52:29
Asi by se to mělo ošetřit proti chybovým hláškám v prohlížečích, které nepodporují localeCompare
Datum vložení: 19.1.2005 15:00:37
Hlásá mi to chybu v MSIE 6 "tabulka má hodnotu null nebo není objekt", tj. na řádku
var telo_tabulky=tabulka.getElementsByTagName("tbody")[0];
přičemž jako tabulku používám tabulku z příkladu na
<a href='http://interval.cz/__redirect/redirect.asp?what=interval_discussion&url=http://interval.cz/podklady/ondra/873/priklad.htm' target='_blank'>http://interval.cz/podklady/ondra/873/priklad.htm</a>
Víte někdo, prosím, čím to?
Díky.