Autor Zpráva
preca2
Profil *
Zdravim,
mám následující HTML a JS kód. Atribut href odkazu je dynamický (mění se v závislosti na co uživatel kliká), proto sem do něj vložil znaky, který normálně používam pro šablony - dvojitý chlupatý závorky. Při načtení stránky chci přečíst hodnotu hrefu, uložit sí jí a pak jí na stránce používat jako šablonu pro finální odkazy.

Problém je v tom, že prohlížeče (alespoň poslední verze FF a Chromia) hodnotu částečně escapují (encodují?) (pouze cestu, ne parametry (query string)).

Když si hodnotu vytáhnu pomocí čistýho JS
document.getElementsByTagName("a")[0].href
dostanu
file:///%7B%7Ba%7D%7D?param={{b}}
Když si hodnotu vytáhnu pomocí jQuery
$("a").attr("href")
dostanu
/{{a}}?param={{b}}
Koukal sem, že jQ interně používá Element.getAttribute. Ta je sice zapovězena místním FAQ, ale v tomhle případě mi myslím nevadí, že IE vrací celou cestu, takže použiju jí.

Dokáže mi někdo vysvětlit, jakym způsobem (podle jakého klíče) prohlížeče escapují atribut href? Proč escapujou jen cestu, ale už ne parametry? Případně navrhnout lepší řešení? Řešení, který sem zavrhnul: - mít cestu uloženou někde v JS - chtěl bych mít cestu přímo u toho odkazu, aby bylo v HTML vidět, kam vede.
- mít cestu na dvou místech (HTML a JS) - pravděpodobně bych jí na jednom z míst zapomněl později upravit, kdyby se cesta změnila a mohlo by to pro někoho (třeba mé pozdější já) být matoucí
Dík
Radek9
Profil
preca2:
Koukal sem, že jQ interně používá Element.getAttribute
To je proto, že si bereš atribut (attr). Pokud chceš vlastnost, použij prop.

jakym způsobem (podle jakého klíče) prohlížeče escapují atribut href?
Pravděpodobně encodeURI.

To escapování je prostě nutné, u adres holt nejsou povolené všechny znaky. ;-)
_es
Profil
preca2:
Chybou je, že zápis atribútu href nie je správne „zakódovaný“ - to by mohlo spôsobovať problémy. Na „odkódovanie“ adresy je v JS funkcia decodeURI.
preca2
Profil *
Radek9:
Pokud chceš vlastnost, použij prop.
prop vrací také file:///%7B%7Ba%7D%7D?param={{b}}
takže v tomhle mi jQ nepomůže

Pravděpodobně encodeURI.
encodeURI("file:///{{a}}?param={{b}}") => "file:///%7B%7Ba%7D%7D?param=%7B%7Bb%7D%7D"
takže pravděpodobně ne.

To escapování je prostě nutné, u adres holt nejsou povolené všechny znaky. ;-)
Tohle chápu, ale proč escapujou pouze cestu a ne parametry? Proč dostanu
file:///%7B%7Ba%7D%7D?param={{b}}
a ne
file:///%7B%7Ba%7D%7D?param=%7B%7Bb%7D%7D

_es:
decodeURI("file:///%7B%7Ba%7D%7D?param={{b}}") => "file:///{{a}}?param={{b}}"
Děkuju, tohle je pravděpodobně lepší řešení.

Jen by mě zajímalo, proč prohlížeče tak zvlásštně kódujou tu hodnotu. Je to chyba, vlastnost? Jestli je to vlastnost, jaký rozhodnutí za ní stojí?
_es
Profil
preca2:
proč escapujou pouze cestu a ne parametry?“...„Jen by mě zajímalo, proč prohlížeče tak zvlásštně kódujou tu hodnotu. Je to chyba, vlastnost? Jestli je to vlastnost, jaký rozhodnutí za ní stojí?
URL kódování – Wikipedie

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: