Portál AbcLinuxu, 30. dubna 2025 14:12
Chtěl jsem do webové fotogalerie přidat přepínání fotky pomocí šipek doleva/doprava. Předělal jsem to teda v railsech na ajax... jenže pak se nemění url a nefunguje zpět a vůbec je to takové ošklivé... a tak jsem začal hledat něco (knihovnu) co by to řešila.... byl jsem zděšen co to jsou všecko za hacky:( Nějak jsem to vyřešil pomocí HTML5, budu rád když mi to zkritizujete.
Obecně se to řeší tak že se mění část url za takovou tou mřížkou (#) protože to je jediné co můžete (zatím) měnit bez reloadu stránky. Ale to je ošklivý hack jak píše tady nějaký chlapík: http://www.kylescholz.com/blog/2010/04/html5_history_is_the_future.html
Prolezl jsem různé knihovny - RHS, jQuery history, bbq - ta byla na mě moc složitá.. Ale všecko mělo nějaké chyby, tlačítko zpět u starých IE se třeba řeší tak že je tam nějaký skrytý iframe, různé timery co kontrolují co 100ms jestli jsme nezmáčkli zpět... prostě je to celé ošklivé.
HTML5 přidává (ano, to HTML5 které si nehoní nad tím že všecko je XMLko ale řeší problémy co jsou;)), přidává mocnou věc a to změnu url bez načtení stránky pomocí pushState o kterém píše ten kylescholz.com. Funguje to v novém Chromiu a Firefoxu 4, jiné věci jsem nezkoušel. Sbastlil jsem tedy něco takového:
Event.observe(window, 'load', function() { window.history.pushState(0, 'pryc', 0); window.history.pushState(@photo.id, 'pryc', @photo.id ); }) // Respond to a popstate event. window.onpopstate = function(e) { if (e.state == 0) { window.location="back_js_url(@back_section)"; } else if (e.state != null){ var basedir = document.location.href; basedir = basedir.substring(0, basedir.lastIndexOf('/')) + '/'; new Ajax.Request(basedir+e.state, { method:'get' }); } };
Můžete mě bít, já javascript neumím a taky se něco tak ošklivého nehodlám učit ale funguje to, na odkazy další/předchozí fotka jsem pomocí :after v Railsech navěsil ještě něco takového:
window.history.pushState(#{photo_prev.id}, 'title', #{photo_prev.id})")
Budu moc rád když mi to pomůžete otestovat na http://www.sigut.net/. V prohlížečích které to umí by se vám tedy při posouvání mezi fotkami mělo měnit url a fungovat tlačítko zpět.
Co mi to pokazí je reload, nevíte jak to vyřešit?
zvlášť rád bych byl kdyby něco zkusil IEčka, až to odladím tak tam přidám testování a v prohlížečích kde to bude fungovat nechám ajax, kde ne tak normální statické přepínání stránek.
Tiskni
Sdílej:
Webpage error details
User Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Timestamp: Mon, 1 Nov 2010 09:39:49 UTC
Message: Object doesn't support this property or method
Line: 55
Char: 3
Code: 0
URI: http://beta.sigut.net/photos/2048
Message: Object doesn't support this property or method
Line: 88
Char: 202
Code: 0
URI: http://beta.sigut.net/photos/2048
Message: Object doesn't support this property or method
Line: 1
Char: 203
Code: 0
URI: http://beta.sigut.net/photos/2048
...atd...
http://beta.sigut.net/photos/2046, klinu na dalsi a zmeni se na
http://beta.sigut.net/photos/2046#a pak uz pri klikani na dalsi to zustava stale takto. Opera 10.63
V opeře(10.10) se url nemění. Je to ten případ s #.
V Midori (webkit) se url nemění, ale je to jiný případ. Když jsem kliknul na fotku, tak jsem měl zobrazenou pořád url alba a stránky, na které jsem byl. Poklikal jsem parkrát na předchozí a url ukazovala pořád stránku alba, tak jsem dal aktualizaovat stránku a url se spravila, jenže při dalším přepnutí se zase nezaktualizovala. Ještě zkusím zkompilovat novou verzi z gitu.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.