AJAX navigace, HTML5 History API
- na1k
- Člen | 288
Zdravím!
Před delší dobou se tu vedla diskuse o ajaxové navigaci v rámci stránky. Původně ještě s použitím hash query stringu, snad to bylo i v roadmapě ale David se po zkušenostech s Twitterem a jeho implementací rozhodl od toho ustoupit.
Přesto se ptám – je tu někdo kdo tuhle navigaci (ideálně přes history API, query string není nic moc) implementoval v současném Nette a podělil by se?
Případně máte nějaké tipy jak to efektivně implementovat, nějaká ponaučení nebo naopak důvody proč to nedělat?
- JakubJarabica
- Gold Partner | 184
Ahoj, jednoduché demo tu: http://hokejbalzirafa.sportvin.sk/…611/diskusia – skús sa ponavigovať v tých taboch a potom naspäť. Je tam implementované pushState a popState bez akéhokoľvek fallbacku v browseroch, ktoré to nevedia. Je to v starých skriptoch od Honzy Marka, takže tam máš radšej len inšpiráciu ako to vyzerá, kód by som nekukal :)
Tu: https://github.com/…ette.ajax.js keď sa dorobí popState, tak to bude úplne tip-top.
Ešte si treba dať pozor na to, že treba pomocou jQuery.ajaxSetup nastaviť pre všetky ajaxové requesty cache:false aby ti pri klikaní naspäť prehliadač nezobrazil JSON výstup v prehliadači.
- na1k
- Člen | 288
Vypadá a funguje to pěkně, něco takového bych rád, jen budu mít ve snippetu celý obsahový blok stránky.
Vnitřně to ale implementuješ jak?
Já se teď po půlroční pauze vracím k Nette a PHP takže mám možná
trochu mezery, ale co si pamatuju, tak ajax request jde používat vždy jen
v rámci jednoho presenteru.
Takže máš jeden presenter (nebo u tebe spíš komponentu) s hromadou
handleXY které suplují akce?
Jelikož bude u mého webu obsahová část spíš menší a méně podstatná, měl jsem v plánu ji převést celou do ajaxu (hlavní prvek stránky je mapa, kterou nechci neustále reloadovat). Obsah ale pokrývá několik presenterů a ty by se mi tímhle smrskly do jednoho byla by to neudržovatelná hromada šrotu, která by při troše štěstí snad i fungovala.
Jak to tedy řešit, pokud nějak? Nedal by se nějak zneužít router, aby
z ajax requestu vyrobil normální request, který by prošel přes všechny
klasické mechanismy s tím rozdílem, že by se při odeslání nevytvořila
úplná response, ale ajaxová?
(Tím že by existovaly klasické presentery reagující pomocí akcí a ne
handle by se současně zachovala kompatibilita pro neajaxí requesty.)
Do vnitřností Nette tolik nevidím. Mohlo by to fungovat anebo je to úplný nesmysl?
- Vojtěch Dobeš
- Gold Partner | 1316
Řešil bych to asi tak, že do beforeRender()
bych dal kontrolu
na Ajax a invalidoval nějaký snippet content
, který by měl asi
stejný stejný rozsah jako blok content
obvykle mívá. Samotný
AJAX signály/akce nijak nerozlišuje.
- na1k
- Člen | 288
vojtech.dobes, díky, funguje to zdá se dobře :-)
A taky převelice děkuju za nette.ajax.js ;-)