Autor Zpráva
Fisir
Profil
Ahoj,
vytvářím webovou aplikaci, kterou chci mít nezávislou na jakékoli JavaScriptové knihovně. Pokouším se napsat si vlastní funkci, která bude použitá pro AJAX. Ve funkci je přítomen i callback, který se má volat až po načtení výsledku. Ten se ale podle všeho volá ihned, protože pokud chci callbackem zapsat výsledek do nějakého elementu, v JavaScriptové konzoli se zobrazí chyba, že responseText je undefined.
function ajax(url,callback){
    if(!url){
        error("Byla detekována chyba: <code>0x01</code>");
    } else {
        if (window.XMLHttpRequest)
          {// code for IE7+, Firefox, Chrome, Opera, Safari
          xmlhttp=new XMLHttpRequest();
          }
        else
          {// code for IE6, IE5
          xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
          }
        xmlhttp.onreadystatechange=function()
          {
               if (xmlhttp.readyState==1){
                  info("Načítám…");
              };
              if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {
                if(callback){
                    callback;
                };
            };
            if (xmlhttp.readyState==4 && xmlhttp.status==404)
                {
                    error("Byla detekována chyba: <code>0x44</code>");
                }
          };
        xmlhttp.open("GET",url,true);
        xmlhttp.send();
    };
};
To je kód funkce. Pokud zavolám funkci takto: ajax("menu.php",document.getElementById("menu").innerHTML=xmlhttp.responseText);, vypíše se chyba: TypeError: Cannot read property 'responseText' of undefined a odpověď se do příslušného elementu nevypíše.Zajímavé je, že pokud funkci nejdříve zavolám bez callbacku, a až poté znovu s callbackem, data se vypíší.
Pokud použiji tento kód: ajax("menu.php",function(){ document.getElementById("menu").innerHTML=xmlhttp.responseText; });, žádná chyba se nevypíše, ale ani callback se neprovede.

Potřebuji poradit, nejspíše je to proto, že se ten callbackový kód vykoná hned po zavolání. Vždyť ale přece ve funkci je podmínka, že se má spustit jen pokud už odpověď dorazila. Nevíte, co s tím mám dělat?
_es
Profil
Fisir:
Funkcia ajax predpokladá, že jej lokálna premenná callback je funkcia, čo výraz document.getElementById("menu").innerHTML=xmlhttp.responseText nie je. Viď Časté potíže, zajímavosti a poučné debaty » Rozdíl mezi voláním funkce a funkcí. Viď aj Časté potíže, zajímavosti a poučné debaty » Používejte var - premenná xmlhttp by mala byť lokálnou premennou a potrebné dáta predávané inak.


Po toľkých pokusoch z refurmulovania textu ( Kritika webu www.j-jaburek.tk) by si sa ho mohol snažiť aj pochopiť.
Fisir
Profil
Reaguji na _es [#2]:
Používejte var
Ano, hned na začátku skriptu je proměnná xmlhttp deklarována pomocí var.

Teď mě něco napadlo! Stačilo zaměnit řádek 21 za callback(); a použít druhou variantu volání callbacku (tj. s function()) a funguje to. Díky za rady.
_es
Profil
Fisir:
Ano, hned na začátku skriptu je proměnná xmlhttp deklarována pomocí var.
Čo tiež nie je dobré riešenie, lebo môžu nastať komplikácie pri viacnásobnom volaní funkcie.
Fisir
Profil
Reaguji na _es [#4]:
môžu nastať komplikácie
Které ovšem nenastávají (nezobrazí se chyba ani upozornění a funkce v pohodě běží).
_es
Profil
Fisir:
Které ovšem nenastávají
Čo ak dáta zo servera prídu až po tom, čo bola funkcia znova volaná?
Fisir
Profil
Reaguji na _es [#6]:
No jo, jenže pokud proměnnou xmlhttp deklaruji uvnitř funkce, nemohu k ní potom přistoupit v callbacku. Nevíte, jak to udělat?
Chamurappi
Profil
Reaguji na Fisira:
Předávej do callbacku rovnou jako argument xmlhttp.responseText, jiné vlastnosti z něj stejně nepotřebuješ.
Fisir
Profil
Reaguji na Chamurappiho [#8]:
Díky.

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: