AJAX
Školení, která pořádám
Článek vyšel na serveru Root.cz.
Článek rozebírá různé možnosti umísťování interaktivních komponent na webové stránky a soustřeďuje se na jeden v současné době poměrně populární. Díky technologii Asynchronous JavaScript and XML je možné z webového prohlížeče elegantně komunikovat s webovým serverem a vyměňovat si s ním data, která se mohou ihned uložit na serveru nebo naopak zobrazit u klienta.
Pokud je na stránce nějaká dynamická komponenta, např. anketa, hlasování nebo konec konců i diskuse, dá se k jejímu zpracování přistoupit mnoha různými způsoby:
- Tradiční řešení spočívá v tom, že akce je realizována běžným odkazem nebo formulářem a po jejím provedení se nahraje celá stránka znovu. Nevýhody jsou zřejmé – pomalost a pracnost vrátit stránku na místo, které bylo zobrazeno před provedením akce.
- Zpracování akce v nově otevřeném okně netrpí neduhy tradičního řešení, řada uživatelů je ale na otevírání nových oken alergická, obzvlášť když je to jenom kvůli oznámení, že jejich hlas byl započten. Toto řešení navíc původní stránku obvykle neaktualizuje aktuálními daty.
- Umístění komponent do samostatného rámu je nejelegantnější u jednoduchých stránek, které využívají dynamické komponenty provozované na jiném serveru. U větších serverů má ale i toto řešení své nevýhody – ve striktním HTML jsou rámy zakázané a stažení každé komponenty znamená další požadavek na webový server.
- Využít skriptování u klienta je pravděpodobně nejpracnější, ale zároveň přináší největší uživatelský prožitek. Realizovat se dá několika způsoby – přesměrováním akce do neviditelného rámu, který skriptem změní původní stránku, dynamickým vytvořením elementu script a jeho umístěním do HTML dokumentu nebo pomocí objektu XMLHttpRequest, který byl pro komunikaci skriptů se serverem přímo navržen.
- Pro hodnocení komentářů na Rootu je použit poměrně neobvyklý přístup, kdy se hlasy ukládají u klienta do cookie a na server se odešlou teprve až s návštěvou další stránky. Vzhledem k množství hodnocených komentářů se mi jeví tento přístup jako velice rozumný, protože jinak by počet požadavků na server neúměrně vzrostl, použít ho lze však jen ojediněle.
- Existují samozřejmě i další možnosti, např. umístění komponenty do Flashe, ty ale není možné použít vždy.
Pro použití objektu XMLHttpRequest se ustálil pojem AJAX, přestože korektní použití tohoto objektu nemusí odpovídat ani jednomu slovu ve zkratce – komunikace nemusí být asynchronní, jako skriptovací jazyk nemusí být použit JavaScript a data se nemusí přenášet pouze pomocí XML. Naopak AJAX se dá výše naznačenými způsoby zajistit i bez objektu XMLHttpRequest.
Příklad – realizace ankety v PHP
Na jednoduchém příkladu si ukážeme, jak se AJAX dá použít pro zpracování ankety. Důležitá část skriptů je univerzální a použitelná i v dalších komponentách.
Hlavní stránka se od ostatních řešení příliš lišit nebude. V případě vypnutého JavaScriptu nebo obecně nefunkčnosti technologie AJAX u klienta se navštíví běžný odkaz, který aktualizuje databázi a stránku celou překreslí. Pro kontrolu toho, jestli uživatel ještě nehlasoval, se používá cookie s platností jeden měsíc, podle potřeb je možné tuto kontrolu samozřejmě změnit. Vazbu na AJAX v tomto souboru zajišťuje volání funkce anketa_hlasovat
.
<?php
// uložení odpovědi v případě vypnutého JavaScriptu
if (isset($_GET["anketa"]) && !isset($_COOKIE["anketa"])) { // primitivní kontrola toho, jestli uživatel ještě nehlasoval
setcookie("anketa", $_GET["anketa"], strtotime("+1 month"));
$_COOKIE["anketa"] = $_GET["anketa"];
mysql_query("UPDATE anketa SET pocet = pocet + 1 WHERE id = " . intval($_GET["anketa"]));
}
// zobrazení ankety
echo "<h3>Anketa</h3>\n";
$result = mysql_query("SELECT * FROM anketa");
echo "<table border='1' id='anketa'>\n";
while ($row = mysql_fetch_assoc($result)) {
$odpoved = htmlspecialchars($row["odpoved"]);
if (!isset($_COOKIE["anketa"])) {
$odpoved = "<a href='?anketa=$row[id]' onclick='return !anketa_hlasovat($row[id]);'>$odpoved</a>";
}
echo "<tr><td class='odpoved'>$odpoved</td><td id='pocet$row[id]'>$row[pocet]</td></tr>\n";
}
echo "</table>\n";
echo "<span id='stav-anketa'></span>\n";
mysql_free_result($result);
?>
Největší část funkčnosti zajišťuje následující JavaScriptový kód. Funkce send_xmlhttprequest
je obálka nad objektem XMLHttpRequest, která zajistí vytvoření správného objektu v závislosti na schopnostech prohlížeče, inicializuje požadavek a nastaví mu případné hlavičky a tělo, prováže ho s obsluhou události a odešle ho. Funkce anketa_hlasovat
tuto funkci využívá a kromě toho znemožní opětovné hlasování vymazáním odkazů a překreslí anketu se započteným hlasem uživatele. V neposlední řadě informuje uživatele o tom, že se ukládají výsledky – vzhledem k tomu, že uživatelé na tento způsob modifikace stránek nemusí být zvyklí, je jejich informování poměrně důležité. Funkce anketa_obsluha
přiřazená k obsluze události onreadystatechange se volá při každé změně stavu, a pokud je požadavek dokončen (readyState má hodnotu 4), aktualizuje data na základě momentálního počtu odpovědí a informuje uživatele o dokončení požadavku.
<script type="text/javascript">
/** Odeslání XMLHttp požadavku
* @param Function funkce zajišťující obsluhu při změně stavu požadavku, dostane parametr s XMLHttp objektem
* @param string GET|POST|...
* @param string URL požadavku
* @param string tělo zprávy
* @param object předané hlavičky ve tvaru { 'hlavička': 'obsah' }
* @return boolean true v případě úspěchu, false jinak
* @copyright Jakub Vrána, https://php.vrana.cz/
*/
function send_xmlhttprequest(state_change, method, url, content, headers) {
var xmlhttp = (window.XMLHttpRequest ? new XMLHttpRequest() : (window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : false));
if (!xmlhttp) {
return false;
}
xmlhttp.open(method, url);
xmlhttp.onreadystatechange = function () {
state_change(xmlhttp);
};
headers = headers || {};
headers['X-Requested-With'] = headers['X-Requested-With'] || 'XMLHttpRequest';
for (var key in headers) {
xmlhttp.setRequestHeader(key, headers[key]);
}
xmlhttp.send(content);
return true;
}
</script>
Za zmínku stojí, že vytvořený objekt xmlhttp
se obslužné funkci předává jako parametr. V tomto jednoduchém případě by to mohla být i globální proměnná, ale vzhledem k tomu, že na stránce může být dynamických komponent více, je nutné mezi nimi rozlišovat. Pokud by se použila globální proměnná a nějaká komponenta by vytvořila nový požadavek ještě před dokončením předešlého, vedlo by to k jeho nedokončení. Je potřeba pamatovat na to, že zpracování je asynchronní.
<script type="text/javascript">
function anketa_hlasovat(hlas) {
// odeslání požadavku na aktualizaci dat
if (!send_xmlhttprequest(anketa_obsluha, 'GET', 'anketa_rpc.php?anketa=' + hlas)) {
return false;
}
document.getElementById('pocet' + hlas).innerHTML++; // zobrazení hlasu u klienta
// znemožnění opětovného hlasování smazáním odkazů
for (var key in document.getElementById('anketa').getElementsByTagName('td')) {
var val = document.getElementById('anketa').getElementsByTagName('td')[key];
if (val.className == 'odpoved') {
val.innerHTML = val.firstChild.innerHTML;
}
}
document.getElementById('stav-anketa').innerHTML = 'Ukládá se';
return true;
}
function anketa_obsluha(xmlhttp) {
if (xmlhttp.readyState == 4) {
// aktualizace odpovědí na základě aktuálního stavu
var odpovedi = xmlhttp.responseXML.getElementsByTagName('odpoved');
for (var i=0; i < odpovedi.length; i++) {
document.getElementById(odpovedi[i].getAttribute('id')).innerHTML = odpovedi[i].firstChild.data;
}
document.getElementById('stav-anketa').innerHTML = 'Uloženo';
}
}
</script>
Skript anketa_rpc.php
je velice jednoduchý – zkontroluje, jestli uživatel ještě nehlasoval, započte jeho hlas a zpět odešle jednoduché XML s aktuálním počtem odpovědí. Jak již bylo řečeno, nemusí spolu skripty komunikovat pomocí XML, u strukturovaných dat je to však poměrně praktické. Pokud by skript generoval nestrukturovaná data, lze k nim z JavaScriptu přistoupit přes vlastnost responseText.
<?php
if (!isset($_COOKIE["anketa"])) {
setcookie("anketa", $_GET["anketa"], strtotime("+1 month"));
mysql_query("UPDATE anketa SET pocet = pocet + 1 WHERE id = " . intval($_GET["anketa"]));
}
header("Content-Type: text/xml");
echo "<anketa>\n";
$result = mysql_query("SELECT * FROM anketa");
while ($row = mysql_fetch_assoc($result)) {
echo "<odpoved id='pocet$row[id]'>$row[pocet]</odpoved>\n";
}
mysql_free_result($result);
echo "</anketa>\n";
?>
Objekt XMLHttpRequest umožňuje i odesílání dat metodou POST. Opět lze poslat XML dokument, je ale možné použít i hlavičku Content-Type: application/x-www-form-urlencoded
a data poslat standardně URL-zakódovaná (jednotlivé části funkcí encodeURIComponent). Z takto poslaných dat PHP vytvoří standardní proměnné.
AJAX se samozřejmě dá použít i na spoustu dalších věcí. Zmíněny byly další dynamické komponenty stránky, dobře viditelné je použití u tzv. našeptávačů nebo u mapových aplikací, použít se dá např. i pro předběžnou kontrolu unikátnosti uživatelského jména u klienta. Fantazii se meze nekladou, důležité je ale vždy zajistit, aby aplikace byla použitelná i bez této funkce. Nevhodné je také AJAXem nahradit např. běžný přechod mezi stránkami, protože uživatelé potom nemohou používat historii a mohou být zmateni, že se stránky chovají jinak, než jsou zvyklí.
Související odkazy
Přijďte si o tomto tématu popovídat na školení JavaScript a AJAX.
Diskuse
takasija:
Chtel bych se zeptat kde vznika problem, kdyz se pri pokusu o odeslani objevi hlaska "Odepření přístupu při volání metody XMLHttpRequest.open" ?
Vlkcy:
Podařilo se získat nějaké informace?
Jedná se nejspíš o cross-domain request. Požadavek je možno pokládat jen na adresu ze stejné domény, na které je stránka.
Jirka K:
Možná budu působit jako diletant, ale já měl podobný problém na localhostu. IE prudil, Firefox nereagoval. Stačilo přidat http:// do volané adresy.
opera:
ako je to soperou?
Malcik:
Když se provede načtení toho kódu, tak se mi ztratí diakritika (místo písmen s háčkem nebo čárkou se ukážou je otazníky). Jak to vyřeším?
Díky
FantomX1:
V dokumente vratenej spravy zmenis header("Content-Type: text/xml") na header("Content-Type: text/xml; charset=windows-1250") alebo na take ake mas na stranke, mozno iso-8859-2.
peta:
Se mi velice libi opakovani konstrukce
document.getElementById
Proc si nezalozis fukci treba
function xObject(x) {return document.getElementById(x)}
Proc? Se ti z nejakeho duvodu stane, ze budes mit potrebu resit objekty pres document.all nebo pres layers, a pak to budes cely pracne prepisovat.
Prikladam funkci pracujici s FRAME nebo aktualnim framem, cili WINDOW, kde vlastne presny zapis by mel spravne byt:
window.document.get...()
zapis pres frame
nazevframu.document.get...()
<FRAME name="nazevframu">
function objGet2(d,x) {d=d==0?document:d; return (d.getElementById?d.getElementById(x):d.all?d.all[x]:d.layers?d.layers[x]:null);}
document.getElementById() je v současných prohlížečích, které podporují AJAX, zcela standardní funkce, přístup přes all nebo layers je zbytečný. A vytvářet funkci jenom jako kratší zápis jiné funkce považuji za samoúčelnou obfuskaci.
Ferda Mravenec:
toto nemusi nutne platit, pri ajaxovani sveho webu jsem se ted dostal do situaci, kdy to v IE 6.0.x funguje, v FF 1.5.x ne, a jako reseni se nabizi kratoucky javascript
if((!document.getElementById) && document.all){
document.getElementById = function(id){return document.all[id];};
}
ktery v pripade, ze stranka neumi getElementById ale umi document.all proste nadefinuje funkci getElementById pouzivajic prave document.all ... to nikomu neublizi a naopak programator se dal muze "odstinit" od ruznych anomalii ve volani gEBI v ruznych prohlizecich ...
longin:
Asi zijes v dobe kde neni mozny nahrazovani textu regulernim vyrazem, coz ;)
Flamer:
myslím, že ve slovníku češtiny je i regulerní. :)
Jakub Vrána :
Je to tak, ale „regulární výraz“ je ustálený pojem.
SmallM:
Regulerní používal soudruh Husák páč se nikdy nenaučil dobře česky a po něm všichni ti soudruzi co pospávali na těch stranických schůzích- Mají to v podvědomí.
Tomas:
Ahoj, zaprve diky za pekny clanek. Zadruhe bych se rad zeptal jak je to s 'licenci' uvedenych kousku kodu. Konkretne jsem funkci 'send_xmlhttprequest' pouzil v jedne firemni webove aplikaci, ale nez to zpristupnime tak bych rad vedel ze to je OK - aby mne pak nekdo nenarkl ze jsem loupeznik. Uvedena tam samozrejme bude vcetne copyrightu atd.
Jakub Vrána :
Je to uvedeno v patičce každé stránky: "Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení."
Tomas:
OK, diky. Hledat to v patičce mne nenapadlo.
CyberLuke:
hezke...ale proc znovu vynalezat kolo? Ajax knihoven je spousta - jen na PHP je jich tusim pres 15 - ma nejoblibenejsi je TinyAjax...ale kdo ma cas a nervy na reseni bugu, tak asi vynaleza kolo porad dokola. No...ale aspon na root.cz vyjde i nejaky ten clanek o ajaxu.
Jeste by se hodilo dodat, ze ten kod je jen ukazkovy...v aplikacich se pouzit neda - resp. da, ale ne dlouho, protoze jak se v tom za chvili nebude dat vyznat, takze doufam, ze ty lamy jen tak nekopiruji do sveho editoru.
Honza Hučín:
Díky tomuto článku jsem úspěšně implementoval techologii AJAXu do jedné aplikace, a to na první pokus. Děkuju moc.
Milan:
Domnívám se, že by ve skriptu pro výpis ankety mělo být
<?php if (!isset($_COOKIE["anketa"])) { ... ?> místo
<?php if (isset($_COOKIE["anketa"])) { ... ?>. Jinak by se nikdy nedalo hlasovat. Promiňte, jestli se pletu.
Jakub Vrána :
Fakt že jo. Zvláštní, že si toho dosud nikdo nevšiml. Opravil jsem to.
Adolf Fritz:
Chcem len podotknúť, že ak vám prehliadač pri vypisovaní pomocou ezophp nbrazuje znaky, ako: ľščťžýáíé... tak stačí do daného skriptu pridať takúto hlavičku... potom to pôjde...
<?header('Content-Type: text/html; charset=Windows-1250');?>
Orly?:
diky moc, toto som dlho hladal, toto mi osobne pomohlo
Rasto:
zdravim. skusal som tento kod a nejako mi to nefunguje. zobrazi sa sice o 1 hlas viac, aj sa odstrani odkaz, ale nezapise sa novy stav do DB.
Yučikala:
Super článek, všechno se mi podařilo rozchodit. Až na diakritiku. Ať sem zkoušel, co sem zkoušel, na místo háčků a čárek mám paznaky "novÄ› čřžýáĂĂ©"
zkoušel sem přidat charset do hlavišky funkce send_xmlhttprequest , ale nepomohlo to...
používám metodu POST
Nevíte, co s tím? Děkuju moc
hugoman:
Skus zmenit kodovanie suboru ;)
Katamaru:
Zdravím, AJAX mi v FF funguje spravne, ale v IE se nedeje nic. Jak ho upravit pro IE?
Marty:
Použil jsem jednoduchou ajaxovou techniku do svého redakčního systému a narazil jsem na problem se zabezpecenim:
makePOSTRequest('../admin/admin_articles_save_now.php?PHPSESSID='+session_id, poststr);
Tato funkce posle data metodou POST souboru admin_articles_save_now.php, jako zabezpeceni jsem pouzil SESSIONS, ve kterych mam ulozene promenne s pravy. Zajimalo by me, jestli je toto reseni dostatecne nebo byste doporucovali nejake jine.
choswe:
Tak sem si vyzkousel tu anketu a bohuzel mi to nefunguje:(
prohlizec mi hlasi u radku:
var xmlhttp = (window.XMLHttpRequest ? new XMLHttpRequest : (window.ActiveXObject ? ... syntax error a pritom sem to zkopiroval cele odsud
Pepa:
Dávám přednost použití Hidden Iframe před Ajax řešením
všude, kde je to únosné. Nicméně jsem už narazil na situace,
kdy Ajax byl jediným možným řešením. Ajax je dle mého názoru
rovněž elegantnější řešeni pro dynamické změny ve formuláří
i jinde.
Jakub Vrána :
Mohl bys popsat situaci, kdy by Ajax byl jediným možným řešením?
kozotoč:
Mě napadá případ, kdy má uživatel ve formuláři vložit firmu / skupinu / družstvo / ... které ještě neexistuje a které je záhodno, aby ji zadal. Klikne na odkaz "vytvořit novou", který mu v novém okně zobrazí druhý formulář pro vytvoření této firmy/skupiny/... , a po odeslání napíše, že byla vytvořena. No, avšak, pak je třeba, aby se v původním formuláři seznam firem/skupin/... aktualizoval. Obdobně v případech, kdy se něco často mění (rezervace knih v knihovně, např. aneb - mezi otevřením formuláře a jeho odesláním mu knihu, co si chce půjčit, může "vyfouknout" jiný čtenář). Atd.
Pepa:
Pokusil jsem se vytvořit Web Online textový editor MVS a Unix (Aix) souborů pomoci Textarea. Samozřejmě v PHP pro
Unix, ale v Gwapirexx pro MVS. Ale to není podstatné. Do kompletně přijatého Formuláře editoru na straně prohlížeče
jsem v onLoad() sekci ajax scriptem dodatečně musel vložit vlastní tělo souboru do pole textarea. Soubor múže mít i tisíce záznamů a všechny možné speciální znaky. Pokud byl soubor součástí html dokument posláného na prohlížeč, tento nedokázal tyto data zpracovat (zblbnul). Nenašel jsem jiné řešení, než poslat obsah souboru asynchronně Ajax metodou do kompletně přijatého dokumentu dodatečně. Na pohled to vypadá docela elegantně a Ajax si získal mé velké sympatie.
Jakub Vrána :
Se správně zakódovanými daty by si měl prohlížeč poradit. Kdyby ne (třeba proto, že by to byly bajty s kódem menším než 32), tak by to jistě šlo JavaScriptem. Pro AJAX zde nevidím uplatnění.
Alojz:
Dalo by sa nejakou funkciou kontrolovat trebars po 3 minutach, kolko je prihlasenych uzivatelov na stranke?
Ako by sa dal ajax vyuzit v tomto?
Ak dobre rozumiem odoslal by sa ajaxom dotaz na vykonanie skriptu a ako by sa zaistilo vypisanie?
Je vobec nutne posielat dotaz na vykonanie skriptu, ked mam zaujem iba o vypis?
Gifi:
mam dotaz.
mam hlavni dokument a v nem reaguje na urcite udalosti ajax v jinem dynamickem php dokumentu. a potrebuji z toho druheho vytahnout data do do prvniho abych mohl data odeslat pres formular. zatim me napadlo reseni pres cookie? existuje neco jineho?
Lukáš Zdechovan:
Ja som mal tiez problemy s diakritikou a chcel som sem len doplnit, ze castokrat ked zapisujete/citate udaje do/z databaze (napriklad cez ajax) a dostavate divne znaky skuste pred vyknonanim databazoveho prikazu SELECT, INSERT, atd zadat DB prikaz SET NAMES 'UTF8'
štíhloprd:
k řádku "if (xmlhttp.readyState == 4) {" v anketa_obsluha().
Co se tak koukám na ostatní ajaxové příklady, v této podmínce pro zpracování bývá přidáván i xmlhttp.status == 200 (HTTP kód 200 - OK). Jinak se bude zpracovávat, i když server bude hlásit chybu.
Tonda:
Ahoj,bylo by možné dát celý příklad ke stažení ?
Jakub Vrána :
Stačí zkopírovat ukázky zdrojového kódu ze článku.
deny:
Může mi někdo prosím vysvětlit, jak je možné, že mi někdo hlasuje v mé anketě bez toho, aniž by se mi uložila jeho ip, i když v jiných případech to funguje? Scriptem by to být nemělo a ochranu před roboty mám snad vyřešenou... Nějaké nápady? Děkuji...
deny:
Již vyřešeno...
Petr:
Bude hlasování fungovat i když bude vypnutý JS?
Magnus:
Pěkný den.
Je nějaký zásadní rozdíl mezi tím, když to budu dělat přes xmlhttprequest nebo přes $.post() - jQuery ?
Jakub Vrána :
jQuery interně používá XMLHttpRequest, takže zásadní rozdíl v tom není.
Petr Šebela:
Dobrý den,
mám problém z dynamickým přidáním prvku formuláře
muj kód vypadá takhle:
</table>
<h2>Ingredience</h2>
<a href="#" id="addbutton">Přidat</a>
<div id="myform"></div>
<?php
if (isset($_POST['odeslat']) and count($_POST['surovina']) > 1) {
$i = 1;
foreach ($_POST['surovina'] as $key => $value) {
echo '<table><tr><td>Surovina</td><td><input type="text" name="surovina[]" id="surovina' . $i . '"></td></tr>
<tr><td>Množství</td><td><input type="text" name="mnozstvi[]" value="' . checkInput($_POST['mnozstvi'][$key]) . '"></td></tr>
<tr><td>Jednotka</td><td><input type="text" name="jednotka[]" value="' . checkInput($_POST['jednotka'][$key]) . '"></td></tr></table>';
$i++;
}
}
else
echo '<table>
<tr>
<td>Surovina</td><td><input type="text" name="surovina[]" id="surovina1" ></td>
<td>Množství</td><td><input size= "30" type="text" name="mnozstvi[]"></td>
<td>Jednotka</td><td><input size= "30" type="text" name="jednotka[]" ></td>
</tr>
</table>';
?>
<tr><td></td><td><input type="submit" name="odeslat" value="Uložit"></td></tr>
</table>
<script type="text/javascript">
$(document).ready(function() {
var counter = 1;
<?php
if (isset($_POST['odeslat']) and count($_POST['surovina']) > 1) {
$i = 1;
foreach ($_POST['surovina'] as $key => $value) {
echo '
$("#surovina' . $i . '").tokenInput("ajax/suroviny.php", {
theme: "facebook",
tokenLimit: 1,
hintText: "Zadejte prosím ingredienci (Brambory, Hranolky, Sůl, apod.)",
noResultsText: "Nenalezeno",
searchingText: "Hledám...",
});
$("#surovina' . $i . '").tokenInput("add", {id: "' . $_POST['surovina'][$key] . '", name: "' . getNameIngred($_POST['surovina'][$key]) . '"});';
$i++;
}
}
else
echo '
$("#surovina" + counter).tokenInput("ajax/suroviny.php", {
theme: "facebook",
tokenLimit: 1,
hintText: "Zadejte prosím ingredienci (Brambory, Hranolky, Sůl, apod.)",
noResultsText: "Nenalezeno",
searchingText: "Hledám...",
});';
?>
$('addbutton').click(function() {
event.preventDefault();
counter++;
var htmlcode = '<table id="myform"><tr>\n\
<td>Surovina</td><td><input type="text" name="surovina[]" id="surovina' + counter + '"></td>\n\
<td>Množství</td><td><input type="text" name="mnozstvi[]"></td>\n\
<td>Jednotka</td><td><input type="text" name="jednotka[]"></td>\n\
</tr></table>';
$('#myform').after(htmlcode),
$("#surovina" + counter).tokenInput("ajax/suroviny.php", {
theme: "facebook",
tokenLimit: 1,
hintText: "Zadejte prosím ingredienci (Brambory, Hranolky, Sůl, apod.)",
noResultsText: "Nenalezeno",
searchingText: "Hledám..."
});
});
});
</script>
</form>
děkuji za případnou reakci :)
PeTaX:
Nepovedlo se mi nikde najít, zda už umí PHP pracovat s LocalStorage a SessionStorage. Víte někdo?
Jakub Vrána :
LocalStorage a SessionStorage jsou technologie prohlížeče. PHP běží na serveru, nemá s tím tedy nic společného.
PeTaX:
To jistě ano. Jen jsem očekával, že by bylo účelné k úložišti na straně klienta přistupovat podobně jako ke COOKIE.
Jakub Vrána :
Na straně klienta je pro práci s těmito úložišti k dispozici normální API, lepší než pro cookie. Na server se tato data vůbec neposílají.
Diskuse je zrušena z důvodu spamu.