Schování části stránky

Školení, která pořádám

Některé části stránky je z důvodu přehlednosti vhodné při nahrání schovat a zobrazit je jen po provedení nějaké akce uživatele. Řeší se to obvykle jednoduchým klientským skriptem, pokud ale chceme, aby vše fungovalo i s vypnutým JavaScriptem, dá to trošku práce.

Pokud se schovanému bloku přímo nastaví <div style="display: none;">, tak si uživatel s vypnutým skriptováním schovaný blok už nikdy nezobrazí. Pokud naopak schovaný blok skryjeme dodatečně JavaScriptem el.style.display = 'none', tak při nahrávání stránky dojde k bliknutí, kdy se blok nejprve na chvíli zobrazí a hned zase skryje. Nejlepším řešením je nastavit schovanému bloku třídu <div class="hidden-js"> a schování této třídy zajistit v části <head>:

<script type="text/javascript">
function show_hide(el) {
	if (/(^| )hidden-js( |$)/.test(el.className)) {
		el.className = el.className.replace(/(^| )hidden-js( |$)/, '$2');
	} else {
		el.className += ' hidden-js';
	}
	return true;
}
document.write('<style>.hidden-js { display: none; }<' + '/style>');
</script>

Elegantnější řešení navrhl Elixon: Na začátek <body> stačí umístit document.body.className += ' javascript'; a styl definovat jako .javascript .hidden-js spolu s ostatními styly.

Přepínání zobrazení je už potom jednoduché: <a href="#schovany-1" onclick="return !show_hide(document.getElementById('schovany-1'));">, což dobře funguje i pokud je JavaScript vypnutý – prohlížeč se přesune na odkazovaný element.

Přijďte si o tomto tématu popovídat na školení JavaScript a AJAX.

Jakub Vrána, Dobře míněné rady, 21.7.2008, diskuse: 51 (nové: 0)

Diskuse

ikona Michal Aichinger:

Ahoj Jakube, musim rict, ze bys mel zustat u PHP, kde jsi daleko jistejsi. I kdyz je to do HEAD, tak pouzivat v dnesni dobe document.write je maximalni prasarna. Pomoci JS jde samozrejme vytvaret elementy a ty pripinat do stromu, takze jde vytvorit element style a jeho obsah a ten pripnout do DOM stromu a bude to fungovat. Pro schovani neni nutne schovanemu elementu prirazovat nebo odebirat tridu, ale ten nas STYLE element odebrat ne?

Ma to vyhodu v tom, ze muze byt schovano vice elemenetu najednou.

BTW. v odkazu na konci clanku je document.getElementById('schovany-1'), tak nejak bych ocekaval z textu ze tedy schovavame lement s ID schovany-1, na prvni pohled to neni zrejme.

Michal

Michal Illich:

Asi kazdy resite neco jineho. Jakub Vrana chce ty prvky ovladat po jednom a to se da nejlepe delat prave tim ubiranim a pridavanim classy...

ikona Jakub Vrána OpenID:

Jde hlavně o myšlenku - jestli se použije document.write nebo document.createElement, je celkem jedno. A jestli to je prasárna nebo ne záleží na úhlu pohledu - připadá ti jako prasárna <?php echo "<h3>$nadpis</h3>"; ?> nebo třeba HTML šablona zapsaná v textovém souboru, místo aby byla vytvořená pomocí DOMu? Myslím, že asi ne. A document.write je totéž, jen na jiné úrovni.

Co se schovávání týče - jak už napsal Michal Illich, jde o schovávání jednotlivých elementů samostatně.

ikona Ondra Žára:

Co se týče prasárny, rád bych upozornil na jednu "drobnost". Pokud se document.write použije ve Firefoxu ve stránce, která vznikla jako produkt client-side XSL transformace, tak dojde k vymazání stránky a nekonečné smyčce. Je to způsobeno tím, že document.write v této situaci zavolá document.open na hotové stránce, což ji zcela rozbije. (To samé je případ volání document.write v kterémkoliv prohlížeči v již "natažené" stránce.)
Zde bych videl podstatný rozdíl mezi document.write a paralelou innerHTML vs. DOM.

ikona Jakub Vrána OpenID:

Ano, document.write nejde v některých případech použít. Pro příklad ani nebylo potřeba chodit tak daleko - nejde použít ani u XHTML dokumentů poslaných s hlavičkou Content-Type: application/xhtml+xml. V jiných případech ale použít jde.

Podle stejné logiky by byly prasárnou i textové šablony, protože se nedají použít při sestavování stránky pomocí DOMu na straně serveru.

Ale nechme toho - v článku mi jde o vyjádření myšlenky, kterou se snažím popsat co nejpřímočařejšími způsoby, což tento bezesporu je.

ikona Michal Aichinger:

"Co se schovávání týče - jak už napsal Michal Illich, jde o schovávání jednotlivých elementů samostatně."

tak nějak to z textu není jasné :) tam se totiž schovává jeden box.

ad prasečina document.write - odpověděl Ondra

ikona Aleš Janda:

Já to řeším o něco jednodušeji - JavaScript, že se má prvek schovat, nedávám za něj, ale přímo do něj hned za definování (takže neblikne):

<div id="chcischovat">
<script>document.getElementById('chcischovat').style.display='none';</script>
Tady je schovaný obsah...
</div>

Zatím to vždy a všude fungovalo perfektně.

ikona Jakub Vrána OpenID:

To je odvážné řešení :-). Čekal bych, že práce s elementem, který ještě neskončil, nebude ve všech prohlížečích (třeba i budoucích) konzistentní.

ikona Aleš Janda:

To je možná pravda. Nicméně zatím mi to ve všech prohlížečích (IE, FF, Opera, Konqueror, Safari) fungovalo bez nejmenšího problému, tak minimálně v současnosti mi to přijde jako nejlepší řešení.

Martin Staněk:

Přístup přes style.display není úplně ideální, neboť je obecně časově pomalejší než práce s className. Čili použití třídy hidden bude rychlejší. Nicméně si nemyslím, že je třeba hidden-js přidávat dynamicky, nevidím k tomu žádný důvod.

Rozhodně bych doporučil nepoužívat parametr onclick, neboť je v případě moderních prohlížečů také velice pomalý. Pokud přepíšete skript do unobstrusive formy, tak zjistíte, že je mnohonásobně rychlejší (testováno Firefox).
Výše publikovaný skript se při prvním volání vykoná za 3,03 ms. Stejný skript přepsaný do unobstrusive formy se vykoná za 0,7 ms. Uznávám, že pro běžnou prezentaci to není nijak omezující. Nevýhodou této formy je délka skriptu, ale pročistí se html kód.

Přikládám ukázku, kterou jsem upravil na tento příklad, takže je trochu nešikovná, ale může posloužit:

<script type="text/javascript">

function addEvent(obj, evType, fn){
  if (obj.addEventListener){
    obj.addEventListener(evType, fn, false);
    return true;
  } else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn);
    return r;
  } else {
    return false;
  }
}
addEvent(window, 'load', init);

function init() {
  // nastavi event listenery
  var ele = document.getElementById("odkaz");

  if(ele.addEventListener) {
     ele.addEventListener('click', handleLink, false);
  } else {
     ele.onclick = function() { handleLink();}
  }
}

function handleLink() {
  process(document.getElementById('schovany-1'));
}
function process(ele) {
  if (/(^| )hidden( |$)/.test(ele.className)) {
     ele.className = ele.className.replace(/(^| )hidden( |$)/, '$2');
  } else {
     ele.className += ' hidden';
  }
}
</script>

ikona Jakub Vrána OpenID:

Důvod dynamického přidání třídy je rozveden v článku - bez něj se s vypnutým JavaScriptem schovaný blok nedá zobrazit.

Co se druhé části příspěvku týče - jsem zastáncem oddělení jednotlivých částí aplikace, takže s řešením bez HTML atributů událostí souhlasím. V článku by se ve spoustě kódu nicméně ztratila myšlenka, o kterou mi jde především.

A přestože jsem i zastáncem psaní efektivního kódu, tak mi argumentace rychlostí v tomto případě přijde úsměvná. Událost se totiž volá jednorázově a ne opakovaně, takže doba odezvy 3 ms je pro uživatele stejně nepostřehnutelná jako 0,7 ms.

Martin Staněk:

To s tou třídou mi nedocvaklo, už je mi to jasné.

Co se týče rychlosti, tak to jsem uvedl pouze pro informaci. Obecně zastávám používání oddělení částí aplikace a chtěl jsem poukázat na to, že unobstrusive javascript je obecně lepší volba. Tedy samozřejmě rychlost zpracování u tohoto příkladu je banalita. Šlo spíše o použítí eventlisteneru.

ikona David Grudl:

Je to fakt dost pomalý, jsem se ty 2ms docela nudil!

ikona karf:

jQuery way:

$(document).ready(function(){ $('.hidden-js').hide(); });

ikona Jakub Vrána OpenID:

Tohle bohužel blikne.

ikona karf:

V 99 % případů by to bliknout nemělo. Tahle funkce se spustí hned po načtení DOM, ne jako onload, která čeká na načtení obrázků atd., takže v drtivé většině případů to skrytí proběhne ještě dřív, než se dokument začne renderovat.

Každopádně skripty vkládané pomocí document.write dokážou nadělat pěknou paseku při kolizi s jinými skripty (např. právě s touto metodou jQuery), když teda slovo "prasárna" tady není politicky korektní.

ikona Jakub Vrána OpenID:

V beztabulkovém designu to naopak blikne vždy, jen to nemusí každý postřehnout. Bliknutí je vidět i když se schování umístí hned za schovávaný blok, natož až za načtení celého HTML.

ikona karf:

Pravda je někde uprostřed. Ano, vykonání metody ready() není zaručeno před renderováním dokumentu. Zda k bliknutí dojde či ne závisí na mnoha faktorech - prohlížeči, složitosti selektoru, složitosti DOMu, výkonnosti stroje atd. (mně ve FF to např. nebliká, opera je na tom hůř ;) A případné nepatrné probliknutí je obvykle akceptovatelné. Pro mě rozhodně víc než dobastlování skriptů do HTML. Ale každý svého HTML strůjcem...

ikona Jakub Vrána OpenID:

Blik bude trvat přinejmenším tak dlouho, kolik času uplyne mezi zobrazením schovávaného elementu a dotažením zbytku stránky. To závisí na rychlosti odezvy serveru a rychlosti linky, což jsou velmi variabilní parametry. Takže pokud ty na rychlé lince a nevytíženém serveru nepozoruješ žádné bliknutí, tak to nic moc neznamená, protože třeba na GPRS nebo vytíženém serveru bude bliknutí třeba v řádu sekund.

Co se "dobastlování skriptů" týče - zdá se, že nedokážeš oddělit myšlenku od její implementace. Předvedená myšlenka se dá implementovat i "čistě" (ať už za to považuješ cokoliv), jak ukazuje třeba Martin Staněk nebo Elixon. Myšlenka tvého řešení je defektní při jakékoliv implementaci.

ikona karf:

OK, uznávám, že s blikáním máš pravdu :) K té druhé části ovšem již bez komentáře :(

Elixon:

Varianta nekterych reseni vyse:

    <style type="text/css">
      body.javascript .jsCollapsible {
        display: none;
      }
    </style>
  </head>
  <body>
    <script type="text/javascript">
      document.body.className+=' javascript';
    </script>

Hever:

Nejpěknější!

Hever:

tedy jazykem frameworku (prototype.js, jqueryáři) -

Element.addClassName(document.body,'javascript');

ikona David Grudl:

Po přečtení jsem zauvažoval, jak to vlastně dělám v šabloně pro Nette::Debug, a koukám že cca stejně: http://code.google.com/p/nette/source/browse/…/bluescreen.phtml#229

Nicméně samotné přepínání už nejde přes třídu, to k eleganci chybí.

ikona bukaJ:

Přátelé, upřednostňujete DOM, ale přitom zapomínáte na úžasnou fci stylesheet.addRule(), nebo potažmo stylesheet.insertRule().

Tedy Jakubovo document.write() z článku bych nahradil takto:

<script type="text/javascript">

    //Fce přidá do stylopisu pravidlo
    function addStyleRule(selector, value) {
      //Vybere první stylopis. Nevím, jak se bude chovat při vypnutých stylech, ale kromě ošetření chyby to není třeba řešit :)
      var stylesht = document.styleSheets[0];
      var styleshts_lngt = (stylesht.cssRules?stylesht.cssRules.length:stylesht.rules.length);
      if (stylesht.insertRule) {
        stylesht.insertRule(selector + ' {' + value + '}', styleshts_lngt);
        return styleshts_lngt;
      } else if (stylesht.addRule) {
        stylesht.addRule(selector, value, styleshts_lngt);
        return styleshts_lngt;
      }
      return false;
    }

    //Smaže pravidlo ze stylopisu
    function delStyleRule(rule_id) {
      var stylesht = document.styleSheets[0];
      if (stylesht.deleteRule) {
        stylesht.deleteRule(rule_id);
      } else if (stylesht.removeRule) {
        stylesht.removeRule(rule_id);
      } else {
        return false;
      }
      return true;
    }

    var style_rule_id = addStyleRule('.hidden-js', 'display: none;');
</script>

Funguje to ve všech mě dostupných prohlížečích (Safari/WIN a IE<5.5 ignoruji) na Windows.

ikona bukaJ:

Zdůrazňuji, že tento kód pouze doplňuje kód Jakuba z článku a je třeba aby tomuto kódu, rspt. volání fce addStyleRule() předcházla nejméně jedna deklarace stylů (byť prázdná).

Kód je samozřejmě umístěn v <head> a proto nezpůsobuje blikání, protože modifikuje definici stylů ještě před načítáním obsahu.

Důvod vzniku těch funkcí je stejný jako u fce addEvent() v komentáři Martina Staňka.

Pro šťuraly: když jsem tento kód před několika měsíci dával do kupy podle DOM specifikace, všiml jsem si, že Opera tyto funkce implementuje podivně, zejména jejich návratové hodnoty. Nepoužívám Operu, ale četljsem o ní, že si na standardy potrpí.

ikona Michal Aichinger:

Dokonce není třeba mít jeden prázdný styl. Ve všem kromě Konqueroru 3.5.5, což snad ani není prohlížeč, lze styl také vytvořit document.createStyleSheet

Uzivatel:

Všetky tieto triky na schovanie časti stránky tak, aby to bolo  čitateľné aj bez javascriptu mi prídu strašne smiešne, bez urážky.

YouTube bez spusteného javascriptu je na dve veci. A ľudí, ktorí si ho nasilu vypínajú môžem z vysoka ignorovať, väčšinou nemajú normálny pohľad na svet. Berte to príliš agresívny príspevok, ale je to jednoducho pravda.

Uzivatel:

Samozrejme, za najčistejšie riešenie považujem práve tú techniku s použitím jQuery. Ostatné považujem za príliš akademické a použiteľné len ako "jednoúčelové". V ostrom nasadení priemerne veľkej stránky, kde už sa nejaký JS framework očakáva, by som to osobne neriešil vlastným riešením .

ikona Jakub Vrána OpenID:

Jak už jsem vysvětlil karfovi – toto řešení je velmi špatné, protože při pomalém připojení nebo vytíženém serveru (což je obojí poměrně běžné) bude průběh načítání stránky odporný.

Pokus se oddělit myšlenku od jejího zpracování. Karf předvádí špatnou myšlenku, ale hezky zpracovanou, já dobrou myšlenku nepěkně zpracovanou (v tvé optice).

Uzivatel:

To ja beriem. No každý sa na problém z iného uhla pohľadu (aspoň ja to tak beriem). Na jednej strane sa bavíme o probléme blikania a na druhej si nikto neuvedomuje ako bývajú stránky vo veľkej miere veľké. Ano so skromným odhadom to je 100kb na jednu stránku (obrázky[pozadia, klikacie odkazy], css, javascript a samozrejme samotné html). To, že sa skryje nejaký malý blok (vačšinou) ma vôbec netrápi ak vidím, že sa celá stránka preblikáva (načítavanie css a obrázkov). Preto radšej volím cestu čistého návrhu, lebo riešiť malé veci a nedajú sa odladiť tie veľké, tak mi to príde "zbytočná" práca.

ikona Jakub Vrána OpenID:

Ale ony i styly a obrázky by se měly načítat tak, aby k blikání nedocházelo - tedy styly určit na začátku stránky (konstrukcí <link> nebo <style> ale bez @import) a obrázkům přisoudit rozměry.

Jít cestou čistého návrhu je správné, ale blikací stránka je přesně zástupcem špatného návrhu. Teprve potom se můžeme bavit o čistotě implementace tohoto návrhu.

Uzivatel:

Neviem, ja rozlisujem cisty a cisty navrh. Osetrovat veci pri prvom nacitaci a zvacsit tym enormne kod a tym ho aj zneprehladnit je podla mojho nazoru, ten cisty navrh, ktory nezastavam. Ak sa to uz raz nacita tak to zostane nacitane. Na to predsa vymysleli cache. Javascript, CSS, obrazky. Vsetko sa cita z pamate pokial to nebolo zmenene. A potom je ten blik tak maly (alebo uz vobec nie je pozorovatelny).

Najlepsia cesta je podla mna loader, kedy uzivatelovi davame riadne najavo, ze stranka este nie je komplet nacitana a nacitava sa. Samozrejme ak sa bavime o stranke kde su interaktivne prvky a nie len cisty text. A v tejto hladine som sa stale pohyboval, preto som spominal, ze pouzijem hotovy framework a vyuzijem jeho prednosti.

ikona Jakub Vrána OpenID:

Vůbec nechápu, čím by se podle tebe měl enormně zvětšovat kód. I když se styly, JS a obrázky uloží do cache, stále zbývá přenést celý zbytek stránky, což neošidíš.

Zobrazovat při načítání běžné stránky jakýsi loader a znemožňovat s ní uživateli pracovat (i když by už mohl), je k němu vrcholně nepřívětivé.

Využití frameworku je OK, ale i v tom případě potřebuješ mít dobrou myšlenku. Myšlenka vyjádřená jako
$(document).ready(function(){ $('.hidden-js').hide(); });
je jednoduše špatná.

Uzivatel:

V tomto som neni taky "zasadovy", aby som povedal, ze myslienka je spatna. Spatna jednoducho nie je, prave naopak, je jednoducho dobra, pretoze je jednoducha. jQuery sa aplikuje automaticky po nacitani DOM stromu alebo okno.
Zalezi co skovavame, kde sa ten element nachadza a co obsahuje.

Ak je to napriklad zapäti stranky tak to vobec nevadi. Ak su to tabky (zalozky v html) tak to tiez nevadi.

ikona Jakub Vrána OpenID:

To, že se chyba vždy neprojeví, neznamená, že to chyba není. A argumentovat tím, že myšlenka je dobrá, protože je jednoduchá, je absurdní.

Uzivatel:

Nenazval by som to chybou, je to funkcia.
Myslienka je dobra, lebo oddeluje vrstvu JS od HTML, tak isto ako CSS oddeluje dizajn od obsahu.
Tym ziskam to, ze staci upravit len jednu cast celej templaty alebo systemu. Ak chcem zmenit javascript nemusim zasahovat do html, to presne robi aj css. Ak chcem zmenit dizajn predsa nemusim zasahovat do html pokial ho nemam napisany odporne.

A velkost HTML je ten najmensi problem ak je napisany dobre bez zbytocneho balastu ako je inline css, inline javascript a ine veci. Ak to ma byt cisto oznackovany dokument.

Ja osobne v tom absurditu nevidim, je to pragmaticky pristup.

ikona Jakub Vrána OpenID:

Točíme se v kruhu. Ty mluvíš o tom, že myšlenka oddělení JS a CSS od HTML je správná. To ti nikdo nebere a mé řešení je možné tímto způsobem také udělat. Jedná se ale o implementaci myšlenky, nikoliv o její smysl.

Bohužel nedokážeš pochopit, že špatná myšlenka implementovaná správně pořád zůstává špatná.

Uzivatel:

Aby sme to uzavreli,

A bohuzial to pochopit dokazem. Ty ju povazujes za spatnu, ja ju nepovazujem za spatnu. Kazdemu vyhovuje nieco ine. Kazda ma svoje vyhody a nevyhody.

ikona Jakub Vrána OpenID:

Špatnost myšlenky není nějaký subjektivní pocit, je to objektivní fakt. Já jsem ti vysvětlil, proč je ta myšlenka špatná - při načítání stránka poskakuje. To je jasná chyba, se kterou se nedá polemizovat.

Uzivatel:

Mne sa uz nechce dalej reagovat

HTML - renderuje sa postupne
XHTML - renderuje sa po nacitani dokumentu (poskakovat nema)

ikona Jakub Vrána OpenID:

Absence postupného načítání stránky je její zásadní slabina, protože uživatel má následně pocit, že se s ní pomalu pracuje. Je to jeden z hlavních důvodů, proč se používá beztabulkový design.

To, že se XHTML dokument nevykresluje postupně, je pouze implementační nedostatek některých prohlížečů a např. Firefox 3 postupně vykresluje i XHTML dokumenty.

A už zase argumentuješ tím, že chyba není chybou, protože se za určitých okolností neprojeví.

Uzivatel:

Najlepsie by bolo ukazat prikladovu stranku, kde sa nieco podobne vyskytuje. Dufam, ze mas nieco pripravene so zmenou atributu cez javascript a tvojim riesenim.

ikona bukaJ:

jQuery je jen framework. Vaše příkazy a objekty se stejně rozpadnou na obyčejné příkazy, takže z něj nikdy nemůžete vytřískat víc, než co byste  dokázali z kódu obyč JS. jQuery jen zjednodušuje práci, ale říkat, že nejlepší řešení je jQuery?! jQuery jen slabším programátorům zaslepí vnímání reality.

Uzivatel:

Ano je to framework. Nikde som nespominal, ze nie. Zjednodusuje pracu, to je pravda. Preto sa frameworky pouzivaju. Ze riesia veci, ktore by si clovek musel napisat od piky, avsak nikdy nebudu take dobre, lebo za hotovymi frameworkami stoji ovela viac ludi, ktori ich testuju a ovela viac ludi, ktori v danej problematike maju ovela vacsi rozhlad a skusenosti ako prave samotny ten programator.
Cas stoji peniaze a bez pouzitia tychto veci, by sa zadavatel jednoducho nedoplatil.

štíhloprd:

Nikdo zatím článek nepochválil, tak budu první - Jakube, vskutku elegantní řešení!

Třeba bys to příště mohl ukázat na jednoduchém příkladu - např. vícestránkový formulář bez mezinačítání.

----
Btw.
* Javascript:document.write("") vskutku není to samé, co <?php echo"";?>, jen na jiné úrovni.
* Zvládne IE 6.0 v Javascriptu regulární výrazy?
* Uživatelů, kteří mají vypnutý Javascript nebo ho jejich prohlížeč nepodporuje, je - údajně - jen 0.5 %. Mě se to zdá trochu málo, vzhledem k tomu, že přibývá lidí, co si je prohlíží z PDA nebo mobilu. Tak jako tak, net accessibility i tak káže zobrazit stránku správně i pro ně.
----

Napadá mě ještě jedna varianta tohoto problému - a to jsou javascriptové prvky nebo ovládání (tlačítka, hejblátka), které je vhodno pro uživatele s vypnutým javascriptem schovat.

Hever:

V PDA už najdeme i javascript (v mobilu tedy asi taky)

ikona xsuchy09:

Osobně používám jiné, i když některým podobné řešení. Mám připravené dva css soubory, jeden je načítán jen v případě zapnutého js a ten přepisuje případné skrytí či zobrazení prvků dokumentu - tedy třídy z názvu napovídající svou funkci:
.hiddenWithJS
.hiddenWithoutJS
atd.
Myslím, že použití je z toho snad jasné ;) poté se jen používá jednoduchá js funkce, která po onclick vymění style.display u daného prvku (v případě zapnutého JS pro např. zobrazení či skrytí nápovědy či prvku s jakoukoliv jinou funkcí, která je na JS závislá). Osobně mi toto řešení vyhovuje, nebliká a zajistí mi jednoduché skrytí/zobrazení prvků závislých na js a samozřejmě i přizpůsobení dokumentu uživatelovým možnostem atd.

had:

hm, tak nevím, nejsem nějak moc zběhlej v týhle problematice, ale řešil jsem to tak, že odkazuji  na dokument a přidávám do URL nějaký parametr a na konci stránky je jednoduchá php podmínka:

<?php if($_GET['parametr']){ ?>
html kód pro zobrazení
<?php } ?>

a nemusím nic řešit složitou cestou...akorát je ještě dobrý udělat nějaký pozicování tohohle prvku přes CSS, aby to bylo "vyskakovací okno" a třeba podbarvit přes background a výstup funguje ve všech prohlížečích... ;)

ikona Jakub Vrána OpenID:

Motivace JS řešení tkví v tom, aby se stránka nemusela ze serveru znovu stahovat.

had:

aha, tak to potom jo ;)

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.