5. března 2007
Pokud jdete stejně jako já s dobou a používáte na svých stránkách k něčemu AJAX, možná i Vaše stránky obsahují více či méně nepříjemnou vadu na funkčnosti nebo dokonce chybu.
Objekt XmlHttpRequest je úžasný nástroj, poslední dobou se mi jej daří s úspěchem protlačit do většiny stránek, které dělám. Vyhovuje mi možnost komunikovat se serverem bez nutnosti reloadu celé stránky, dostupné metody GET a POST plus možnost nastavovat (setRequestHeader) a číst (getResponseHeader) HTTP hlavičky požadavků přímo vybízí k použití v promakaných administračních rozhraních (více zde).
Radost z téměř půl roku vyvíjeného administračního rozhraní mi trvala asi měsíc. "Jaktože nemůžu do názvu položky v katalogu napsat znak +?" byla ta věta, která toto krásné období ukončila. Skutečně, bylo třeba si přiznat, že administrační rozhraní není schopné vložit položku se znakem + v názvu, ono plus se vždy nahradilo za mezeru.
Data byla odesílána metodou POST, proto bylo evidentní, že problém spočívá ve (špatném) zakódování do www-form-urlencoded (v tomto kódování jsou všechny mezery zakódovány právě do znaku plus a při dekódování na straně serveru se tato plus dekódují zpět na mezery). Javascript, a tím pádem i objekt XmlHttpRequest odmítá "opravdová" plus escapovat jako ostatní nealfanumerické znaky. A jsme v pytli, úžasný nápad použít místo klasického + jeho entitu + se nakonec neukázal jako úplně šťastný, protože minimálně v HTML žádná taková entita neexistuje.
Nápad číslo dvě sice nebyl příliš efektivní a podložený znalostmi, zato byl ovšem velmi efektní a v konečném důsledku vedl ke zdárnému cíli. Vzhledem k tomu, že klasické formuláře v HTML se znakem plus samozřejmě žádné problémy nemají, vytvořil jsem si jednoduchou HTML stránku s formulářem a jedním textovým polem. Spustil jsem "hackerský" a děsně cool prográmek Wireshark a začal odposlouchávat packety v naší domácí síti. Poté jsem přes dříve vyrobený formulář odeslal metodou POST znak plus (na Seznamu z něho museli mít radost :-D) a v odposlechnutém packetu si přečetl, že se znak + správně kóduje jako %2B. Ne že bych neznal ASCII tabulku nazpaměť nebo že bych se neuměl podívat do PSPadu, ale v daný moment mě opravdu žádný lepší způsob, jak se kóduje plus, nenapadl.
Následuje implementace záplaty - je to jednoduché, stačí v odesílaných datech pouze nahradit všechna plus za sekvenci %2B, například takto:
http_request.send('prusvih=ajax+plus'.replace('+', '%2B'));
Pokud uvažujete stejně jako já, napadly Vás právě dvě otázky ohledně znaku procento.
S pomocí Wiresharku se mi podařilo zjistit, že v tomto ohledu se javascript chová (navíc kupodivu v celém trojlístku prohlížečů) nejlépe jak může. Pokud za procentem objeví dvouciferné šestnáctkové číslo (například 2B v případě našeho plus), poté znak % nechá na pokoji a neescapuje ho. Ve všech ostatních případech je znak procenta escapován pomocí znaků %25. Takže tímto problémy končí.
Aneb jak napsat stránku o jednom řádku kódu v javascriptu...
Publikováno dne 05. 03. 2007 v kategorii Programování
Odhadnutá klíčová slova BETA: plus | znak | javascript | napsat | html | GET | znaky | metoda | post
Mohlo by Vás zajímat BETA: HP PhotoSmart Plus e-All-in-One (CN216B) - ideální multifunkční tiskárna s podporou Airprint (recenze)
O kategorii Programování
V nejodbornější kategorii tohoto blogu jsou zařazeny články s mými programátorskými zkušenostmi získanými několikaletou praxí tvorby stránek a java aplikací pro mobilní telefony.
Sergej B. (dne 31. 05. 2011 v 18.00)
Objev Ameriky :-)
JavaScript pro tyto potřeby má funkci escape
Marekzprahy (dne 31. 05. 2011 v 19.25)
Sergej B.: I po více než 4 letech je ten článek pořád pro některé lidi ve firmě přínosný - včetně Tebe, Sergeji ;-)
http://www.w3schools.com/jsref/jsref_escape.asp
Sergej B. (dne 01. 06. 2011 v 07.53)
No zrovna escape použivam kde je to nutné od doby co AJAX použivam - nevím v čem myslíš ten přinos por mě ?
ale to je fuk , ten prototype pro AJAX stejně ne buduje request stringy, a jesli jsem na to nezapominal, tak tam je
Marekzprahy (dne 01. 06. 2011 v 09.54)
cituji z výše uvedeného odkazu:
Definition and Usage
The escape() function encodes a string.
This function makes a string portable, so it can be transmitted across any network to any computer that supports ASCII characters.
This function encodes special characters, with the exception of: * @ - _ + . /
Programátor, samozvaný hodnotitel a zejména kritik.
Pan Vyplňto.cz a tvůrce několika webových stránek.