Autor | Zpráva | ||
---|---|---|---|
deader Profil |
#1 · Zasláno: 8. 9. 2010, 11:52:21
Zdravím, vytvořil jsem dynamickou ajax aplikaci a narazil jsem na problém s cacheováním v Chromu(možná i jinde).
Například:otevřu galerii, provedu nějaké změny, přejdu někam jinam, vrátím se a galerie se zobrazí v původním stavu. Historii řeším pomocí intervalu, který kontroluje location.hash, v IE to řeším skrytým iframem. Funkce pro načítání scriptu, který vypíše obsah generovaný pomocí PHP: function spust(akce, prvek) { var vystup = document.getElementById(prvek); var hlavicka = document.getElementsByTagName('head')[0]; var dataLoader = document.getElementById('scriptLoader'); if(dataLoader) hlavicka.removeChild(dataLoader); script = document.createElement('script'); script.id = 'scriptLoader'; script.src = akce; x = document.getElementsByTagName('head')[0]; x.appendChild(script); return false; } Do načítánych scriptů jsem přidal Header("Cache-Control: no-cache"); Potřeboval bych tedy poradit, jak donutit prohlížeč, aby se script v případě změny(nebo vždy) načetl znovu. Děkuji za odpovědi. |
||
Chamurappi Profil |
#2 · Zasláno: 8. 9. 2010, 12:33:15
Reaguji na deadera:
Přidávej k adrese nějaké neškodné náhodné smetí. |
||
_es Profil |
#3 · Zasláno: 8. 9. 2010, 12:50:22
deader:
„Historii řeším pomocí intervalu, který kontroluje location.hash“ V novších prehliadačoch funguje aj udalosť window.onhashchange. Alebo ešte môžeš skúsiť toto. |
||
deader Profil |
#4 · Zasláno: 8. 9. 2010, 14:46:32
Chamurappi: Díky, jak jednoduché! Obnoví to ale pokaždé, lepší by bylo obnovování jen při změně. Nepomohlo by nastavit cacheování toho souboru, který generuje ten výpis, na must-revalidate? Nevím ale, jak na to.
_es: vím o onhashchange, ale nevěděl jsem, jak to zkombinovat s intervalem pro starší prohlížeče, dík tedy za ten odkaz. |
||
_es Profil |
#5 · Zasláno: 8. 9. 2010, 15:39:45 · Upravil/a: _es
deader:
„jak to zkombinovat s intervalem pro starší prohlížeče“ Podľa testu v tej dokumentácii by to mohlo byť spravené takto: if ("onhashchange" in window) {priradnenie do onhashchange} else {nastavenie setInterval); in nie je pri vstavaných udalostiach vždy spoľahlivé. Napríklad tento kód zobrazí v rôznych prehliadačoch rôzny výsledok a pritom tú udalosť podporujú všetky:
javascript:alert("onload" in window) „lepší by bylo obnovování jen při změně.“ To priradenie nejakej funkcie do window.onunload si skúšal?
|
||
Gappa Profil |
#6 · Zasláno: 8. 9. 2010, 19:12:33
_es:
„if ("onhashchange" in window) {priradnenie do onhashchange}“ co jsem zkoušel, tak jsem narazil na problém s IE8 v režimu kompatibility s IE7 - podmínka projde, event ale neexistuje. |
||
deader Profil |
#7 · Zasláno: 8. 9. 2010, 20:27:46
Nevím, co s tím má to onunload společného, onunload přece nastane při přechodu na jinou stránku a k tomu při změně stránky javascriptem nedochází. Interval funguje všude, onhashchange by bylo akorát o trochu rychlejší. Stejně největší zpomalení je, že se to musí v IE řešit přes iframe, protože IE neukládá hashe do historie. Ale takhle by to šlo, ne?, ještě jsem to nezkoušel:
(function(){ var l = location, h = l.hash; var t = setInterval(function(){if(h !== l.hash) h = l.hash, f();}, 50); window.onhashchange = function(){clearInterval(t); f(); window.onhashchange = f; }; function f(){/* príkazy po zmene location.hash */} })(); Každopádně mě ale v dotazu šlo o to, jak omezit cacheování načítaného scriptu s novým obsahem, jak řeším historii jsem uváděl jen pro přehled. Chamurappi mi pomohl, ale při jeho řešení se obsah obnovuje ze serveru pokaždé znovu a já bych chtěl, aby se obnovoval ze serveru jen při změně jeho obsahu. |
||
_es Profil |
#8 · Zasláno: 8. 9. 2010, 22:21:56 · Upravil/a: _es
deader:
„Nevím, co s tím má to onunload společného, onunload přece nastane při přechodu na jinou stránku a k tomu při změně stránky javascriptem nedochází“ Ale ak je na stránke onunload definované, tak môžu potom prehliadače inak postupovať pri rýchlom zobrazení stránky priamo z pamäti. Neukladajú si vtedy stránku do nejakej rýchlejšej medzi-pamäti - aspoň tak som to niekde čítal.
„Ale takhle by to šlo, ne?“ To som písal ja, v tomto prípade setInterval beží do výskytu prvej udalosti, potom sa vypne.
Asi by sa to dalo ešte vylepšiť - napríklad otestovať vznik udalosti v nejakom iframe , alebo len zmenením hashu na nejakú inú hodnotu a potom hneď obnoviť pôvodný hash.
|
||
polom Profil * |
#9 · Zasláno: 9. 9. 2010, 01:13:50
_es:
„Len si nie som istý, či to tak bude fungovať vo všetkých prehliadačoch, lebo testovanie pomocou operátora in nie je pri vstavaných udalostiach vždy spoľahlivé.“ hasOwnProperty |
||
_es Profil |
#10 · Zasláno: 9. 9. 2010, 06:13:09 · Upravil/a: _es
polom:
Metóda hasOwnProperty je rovnako nespoľahlivá ako operátor in , dokonca ešte potenciálne nespoľahlivejšia - nezačíta vlastnosti z prototypu. Dá sa to overiť na kóde:
javascript:alert(window.hasOwnProperty("onload")); |
||
deader Profil |
#11 · Zasláno: 9. 9. 2010, 14:17:17
Aha, takže mám definovat onunload na prázdnou funkci?
|
||
_es Profil |
#12 · Zasláno: 9. 9. 2010, 14:35:47
deader:
„Aha, takže mám definovat onunload na prázdnou funkci?“ Alebo pre istotu nech tá funkcia robí niečo "neškodné". Ja som to netestoval, len ma to napadlo v tej téme, čo som dal na ňu odkaz v [#3], a tomu to vraj pomohlo. |
||
deader Profil |
#13 · Zasláno: 10. 9. 2010, 11:37:32
Nadefinoval jsem onunload na fci, která nastavila novou proměnnou, ale bohužel to nepomohlo. Nebylo by lepší ten načítaný soubor kešovat na must-revalidate, jak jsem již psal, třeba pomocí htaccess? nějak takhle:
<Files ~"vlozit\.php$"> Header append Cache-Control "must-revalidate" </Files> A nešlo by to onhashchange udělat takhle?: if("onhashchange" in window) window.onhashchange = f; else if(window.hasOwnProperty("onhashchange")) window.onhashchange = f; else{ var l = location, h = l.hash; var t = setInterval(function(){if(h !== l.hash) h = l.hash, f();}, 50); window.onhashchange = function(){clearInterval(t); f(); window.onhashchange = f; }; } |
||
Časová prodleva: 14 let
|
0