Autor Zpráva
zis
Profil *
caute

mam jeden problem. Nacitam ajaxem cca kazdejch 10s nejaky hodnoty z db. Dat moc neni ale vraci mi cast html(nejaky tabulka).
Problem je pokud reknu ajaxem o data jednomu scriptu vse je ok data se vypisou, pokud zazadam o data 3 skriptu nevypise se mi nic.

Myslim ze z ukazky kodu to bude nazornejsi.

kód je nejaky takovy

preloadData(1);
function preloadData(id)
{  
  setInterval("refreshData(id)", 10000); // kazdejch 10 vterin
} 

function refreshData(id)
{  
// pokud je zde jen jedna funkce tak to facha

  preloadLineUpHome(id); 
    
  preloadLineUpAway(id);
   
  preloadReporting(id); 
} 


function preloadReporting()
{
    getData("/online/getreport.php?id=" + id, "online_reportage");   // s jakym skriptem se spojit a  
}

function preloadLineUpHome()
{
    getData("/online/getlineuphome.php?id=" + id, "online_lineup_home");    
}

function preloadLineUpAway()
{
    getData("/online/getlineupaway.php?id=" + id, "online_lineup_away");    
}

//vytvoreni objektu a spojeni se skriptem
function getData(url,element_id)
{
  if (window.ActiveXObject)
  {
    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
  }
  else
  {
    httpRequest = new XMLHttpRequest();
  }
        
  httpRequest.open("GET", url, true);
  httpRequest.onreadystatechange= function () {processRequest(element_id); } ;
  httpRequest.send(null);
}

//ziskam hodnoty a ulozim do danyho elementu
function processRequest(element_id)
{
  if (httpRequest.readyState == 4)
  {
    if(httpRequest.status == 200)
    {
      document.getElementById(element_id).innerHTML = httpRequest.responseText;
    }
    else
    {
        alert("Chyba pri nacitani stanky "+ httpRequest.status +" : "+ httpRequest.statusText);
    }
  }


Diky za jakekoliv napady a pripominky
DJ Miky
Profil
Pro každý z těch tří požadavků si vytvoř vlastní httpRequest objekt. Takhle ti každé volání přepíše to minulé, takže se provede jen to poslední.
kajaman
Profil
v Ajaxu nejsem zrovna odborník, ale když se toho zatím nikdo nechopil....

1, tenhle zápis mi připadá zvláštní: „httpRequest.onreadystatechange= function () {processRequest(element_id); } ;“, spíš by tam mělo být něco jako

httpRequest.onreadystatechange= osefujZmenu;


a dole potom další funkce:
function osefujZmenu () {    
}


2, ale především myslím, že to máš MOC MOC SLOŽITĚ NAPSANÝ. Máš tam tři různé funkce,
které slouží jen k tomu, aby se volala 4. funkce s různými parametry?!
Měsíček
Profil
To co píšeš v bodě [1] je IMHO blbost kajamane.
kajaman
Profil
Měsíček
jj, je to možný, jen jsem ten jeho zápis nikdy neviděl... jak píšu, Ajaxem zrovna moc nevládnu...
Měsíček
Profil
Vyzkoušej si tohle:
<script type="text/javascript">
  window.onload = function () { alert(1); };
</script>
mimochodem i to tak někdy používám.
kajaman
Profil
hmm, no já myslím, že to je trochu něco jiného. Ty tady definuješ nějakou funkci, která se hned po události taky spustí. V té Ajax metodě onreadystatechange se definuje handler, ale funkce se spouští až při změně stavu toho objektu.
Leo
Profil
"Ty tady definuješ nějakou funkci, která se hned po události taky spustí. V té Ajax metodě onreadystatechange se definuje handler, ale funkce se spouští až při změně stavu toho objektu."

A jaky je v tom rozdil? onreadystatechange je taky udalost, Leo
kajaman
Profil
njn, tohle se vykoná hned, že jo?

window.onload = function () { alert(1); };

tohle se vykoná, až nastane "readystatechange", ne?

httpRequest.onreadystatechange= osefujZmenu;

takže myslím, že rozdíl je v tom, že tohle nastavuje vlastnost
objektu XMLHttpRequest.
Měsíček
Profil
Ne. To první se vykoná až se načte celá stránka (tedy při události onload) a tam to druhé se vykoná až bude připraven httpRequest. Viz můj příklad (editoval jsem tam ten příspěvek).
zis
Profil *
Predevsim diky za vsechny odpovedi

Pro každý z těch tří požadavků si vytvoř vlastní httpRequest objekt. Takhle ti každé volání přepíše to minulé, takže se provede jen to poslední.

no to se snad vytvari pri kazdym volani ty metody ne?

  
if (window.ActiveXObject)
  {
    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
  }
  else
  {
    httpRequest = new XMLHttpRequest();
  }
zis
Profil *
respektive kdyz udelam funkci

function createRequest()
{
  if (window.ActiveXObject)
    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
  else
    httpRequest = new XMLHttpRequest();
  
  return httpRequest;
}


a pak ji volam pro kazdej preload dat

function preloadReporting()
{
    getData(createRequest(),"/online/getreport.php?id=" + id, "online_reportage");    
}

function preloadLineUpHome()
{
    getData(createRequest(),"/online/getlineuphome.php?id=" + id, "online_lineup_home");    
}

function preloadLineUpAway()
{
    getData(createRequest(),"/online/getlineupaway.php?id=" + id, "online_lineup_away");    
}


tak taky bez ucinku, je to v podstate to samy, nebo jak si to myslel s vytvarenim tech vlastnich httpRequest objektu
Měsíček
Profil
Hm, tak budu opakovat DJ_Mikyho .. pro každý požadavek si vytvoř nový objekt, jinak když budeš volat pořád ten sám, budou se přepisovat a vypíše se pouze poslední.
zis
Profil *
hm mno tohle mi moc nepomuze, jak mam teda vytvorit pro kazdej pozadavek novej objekt, myslel sem ze se vytvari v ty metode getData. diky
Měsíček
Profil
Ano on se vytvoří z názvem "x", ale další funkcí, kterou voláš (get_data()) tak to přepíšeš a jede se nanovo. Co myslíš, že vyhodí alert()?
<script type="text/javascript">
  var x = 1;
    function x_a () { x = 2; }
    function x_b () { x = 3; }
    function x_c () { x = 4; }
      x_a();
      x_b();
      x_c();
  alert(x); // ?
</script>
zis
Profil *
jo dik uz to fachci,

Řešení: udelal sem to presne pode Měsíčka

dikes
Leo
Profil
kajaman


"njn, tohle se vykoná hned, že jo?

„window.onload = function () { alert(1); };“

tohle se vykoná, až nastane "readystatechange", ne?

„httpRequest.onreadystatechange= osefujZmenu;“"

Oba kody se vykonaji hned :-) ale pokud jde o volani prirazene fce (at uz anonymni, coz je prvni pripad, nebo pojmenovane, coz je druhy pripad) tak ta se vola az (a pokuf vubec) dojde k udalosti. Leo

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:

Prosím používejte diakritiku a interpunkci.

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

0