Autor Zpráva
deader
Profil
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");
, ale to nepomohlo.
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
Reaguji na deadera:
Přidávej k adrese nějaké neškodné náhodné smetí.
_es
Profil
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
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
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);
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é. 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
_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
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
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 *
_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
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"));
V IE to dokonca vyhadzuje chybu.
deader
Profil
Aha, takže mám definovat onunload na prázdnou funkci?
_es
Profil
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
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>
- ale moc se v tom právě nevyznám, hází to error 500, možná je to na serveru zablokované

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; };
}

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:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0