Autor Zpráva
nikos
Profil
Dobrý den.

Vážení,
opět jsem zkoušel něco, co předpokládám, že by mělo fungovat, ale nemohu toho dosáhnout. Jde mi o rekurzivní volání funkce v Javascriptu.
Mám HTML Form, který volá JS funkci a přes AJAX plní jeden DIV. Měl jsem představu, že se v DIVu vytvoří <SELECT>, rekurzivním voláním načte hodnota vytvořeného objektu (resp. prvního <OPTION>) a na základě zjištěné hodnoty vytvořit další <SELECT> v jiném DIVu.
Bohužel po odeslání prvního SELECTu ještě v době, kdy potřebuji zjistit jeho hodnotu, tento objekt neexistuje. Přitom pokud si dám alert()em vypsat tuto hodnotu dvakrát po sobě, podruhé už objekt existuje.
Potřeboval bych tedy nějak zpozit druhé (rekurzivní) volání do doby než bude objekt existovat (tedy něco jako alert() bez nutnosti interakce uživatele). Zkoušel jsem while() či timeout() - bohužel to nepomáhá tyto funkce se chovají jinak než alert().
Pro konkrétní představu přikládám kód js souboru. Volání probíhá tak, že se ze stránky zavolá funkce hrAjax s parametrem 'hrFormR' nebo rovnou 'hrCboRok' a když dospěje kód rekurzí (druhý switch) k řádku, kde se používá funkce getRok (v parametru 'hrCboDen'), tak objekt document.hrFormR.Rok ještě neexistuje (stačí před jeho první použití dát zmiňovaný alert() a vše běží OK).

Máte prosím někdo nějaké řešení ?

Díky moc,
nikos

var hrhttp2 = (window.XMLHttpRequest ? new XMLHttpRequest() : (window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : false));
var hrhttp3 = (window.XMLHttpRequest ? new XMLHttpRequest() : (window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : false));
var hrhttp4 = (window.XMLHttpRequest ? new XMLHttpRequest() : (window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : false));

////////////////////////////////////////////////////////////   hrAjax
function hrAjax(cJsAction) {

switch (cJsAction) {
  case 'hrFormR': 
       var ohttp = hrhttp2;
       var cPhpAction = new String("getFormR");
       var cDiv = new String("divhrform");
       break;

  case 'hrCboRok': 
       var ohttp = hrhttp3;
       var cPhpAction = new String("getCboRok");
       var cDiv = new String("divhrformrok");
       break;

  case 'hrCboDen': 
       var ohttp = hrhttp4;
       var cPhpAction = new String("getCboDen&rarok="+getRok());
       var cDiv = new String("divhrformden");
       break;

  default:  
       alert("Chybná hodnota parametru !!!");
       return true;
}

var lRet=filldiv(ohttp, cPhpAction, cDiv);

switch (cJsAction) {
  case 'hrFormR': 
       hrAjax('hrCboRok');
       break;

  case 'hrCboRok': 
       hrAjax('hrCboDen');
       break;

  case 'hrCboDen': 
       hrAjax('hrCboDos');
       break;
}

return lRet;
}

////////////////////////////////////////////////////////////  Funkce aplikace
function getRok() {
var cVal = document.hrFormR.Rok.options[document.hrFormR.Rok.selectedIndex].value;
return cVal;
//return document.hrFormR.Rok.value;
}

function getDatum() {
var datum = new Date();
return datum;
}


////////////////////////////////////////////////////////////   Obecne funkce
function filldiv(ohttp, cAction, cDiv) {
 if(!ohttp){
  alert("AJAX - chyba !!!");
  return true;
 }
 ohttp.onreadystatechange = function () {hrgettext(ohttp, cDiv); } ;

 var url = new String("dthr.php?action=" + cAction+"&rnd=" + getDatum());

 ohttp.open("GET", url, true);
 ohttp.setRequestHeader("Pragma","no-cache"); 
 ohttp.setRequestHeader("Cache-Control","no-store, no-cache"); 
 ohttp.send(null);
}

 return false;
}

////////////////////////////////////////////////////////////   
function hrgettext(ohttp, oObject){
 if (ohttp.readyState == 4){
  if(ohttp.status == 200  || ohttp.status==0){

   document.getElementById(oObject).innerHTML = ohttp.responseText ;
  }
  else alert("Chyba: "+ ohttp.status +":"+ ohttp.statusText);
 }
}

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