21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
fairman
Profil *
Ahoj, mám takový malinký problém. Mám vytvořenou ajaxovou aplikaci, ale běží to jen ve Firefoxu, následující kód je podstata té aplikace, tento kód také nefunguje v Internet Exploreru 6 i 7.

Má to dělat to, že se po kliknutí na "aktualizovat" pustí funkce provedAjax, vytvoří se httpRequest a následně se pošle GET požadavek na soubor testovaci.php, který je v adresáři ajax. Ve Firefoxu se čas normálně aktualizuje, načte se nová hodnota a vypíše do potřebného DIVu, zatímco v IE to nejede a hlavně nehlásí žádnou chybu. Čas se neaktualizuje ani po stisku F5, ale jestliže si stránku ajax/testovac.php otevřu v jiném okně a poté v původní stránce, kde se čas vypisuje dám F5, tak se nový čas načte. Čím to je, že IE se chová takhle divně a neaktulizuje se to samo?

V reálu mi to dělá to, že volaný php soubor provede změnu v databázi a do stránky se načte nový seznam podle provedených změn. Zajímavé je, že když v IE změnu provedu, tak ona se provede, ale nenačte se ten seznam, musím opět spustit ručně daný php soubor a pak dát na původní stránce F5, aby se to aktualizovalo.

Podstatou problému tedy je, že Internet Explorer není schopný přes httpRequest načíst nový responseText.

<script>
function provedAjax(kontajner)
{
var url;
url = "ajax/";
url += kontajner;
url += ".php";
if (url != 0)
{
if (window.ActiveXObject)
{
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
httpRequest = new XMLHttpRequest();
}
if(!httpRequest)
{
alert("Objekt nebyl vytvoren");
}
httpRequest.open("GET", url, true);
httpRequest.onreadystatechange= function () {zpracuj(kontajner); } ;
httpRequest.send(null);
}
return false;
}

function zpracuj(kontajner)
{
if (httpRequest.readyState == 4)
{
if(httpRequest.status == 200)
{
document.getElementById(kontajner).innerHTML = httpRequest.responseText;
}
else
{
alert("Chyba pri nacitani dat, zkuste to pozdeji - "+ httpRequest.status +":"+ httpRequest.statusText);
}
}
}
</script>
<a href='#' onClick=provedAjax('testovaci')>aktualizuj</a><br>
<div id='testovaci'>
//Zde má být vypsán čas
</div>
<script>
provedAjax("testovaci");
</script>
fairman
Profil *
Ještě malý přídavek:
To v "reálu mi to dělá" je myšleno, že skutečná aplikace dělá popsanou věc, toto je pouze modeový příklad, kdy IE není schopný načíst podruhé bez manuálního refreshe dané stránky nový responseText.
Dero
Profil
Asi bude potřeba obelstít cache.

var url;
var d = new Date();
url = "ajax/";
url += kontajner;
url += ".php?";
url += d.getTime();

(pozor na přidání otazníku za ".php")
Leo
Profil
"Asi bude potřeba obelstít cache."

Co treba primo pomoci patricnych http hlavicek, kdyz uz to tvorime v PHP? Leo
krteczek
Profil
Leo: pokud to odesílá z načtené stránky javascriptem je třeba přidat sůl do adresy. jedná se o kešování JS komunikace, jestli je možné toto ovlivnit na straně serveru si nejsem jist
Vlastně ano, pokud bude skript se kterým se komunikuje posílat zároveň správné hlavičky tak by nemělo docházet ke kešování.
Nicméně přidávat sůl do js dotazů doporučují i v literatuře (netvrdím že je to správně).
krteczek
one_k
Profil
header("Cache-Control: no-cache, must-revalidate");
Dero
Profil
Co treba primo pomoci patricnych http hlavicek, kdyz uz to tvorime v PHP? Leo

Nicméně přidávat sůl do js dotazů doporučují i v literatuře (netvrdím že je to správně).

Je to správně. Teď mluvím ze zkušenosti s velkým AJAXovým projektem (jeden dotaz na server za pět sekund, tisíce uživatelů), který se v IE tu a tam špatně reloadoval i při posílání uvedené (+ dalších) hlavičky. Salt je nejjednodušší a nejúčinnější řešení toho problému, jak bylo experimentálně ověřeno.
one_k
Profil
Dero
Souhlas.
Osobne pouzivam oboje(salt + no-cache). Mozna je to zbytecnost ale pro sichr.
Funguje pri X dotazech za vterinu pri nekolika desitkach tisic useru denne.
Dero
Profil
Osobne pouzivam oboje(salt + no-cache). Mozna je to zbytecnost ale pro sichr.

Nápodobně, vyřešilo dost "záhadných" problémů.
Leo
Profil
Je pravda, ze konkretni klient/proxy muze byt nastaveny i tak, ze na http hlavicky kasle... Leo
fairman
Profil *
url += d.getTime();
Tisicere diky, pátral jsem po řešení špatnou cestou, je to takhle jednoduchý, ale ono po třech hodinách lítání mezi dvěma počítači (na svým nemám windows) už jsem toho měl dost :)
Toto téma je uzamčeno. Odpověď nelze zaslat.

0