Autor | Zpráva | ||
---|---|---|---|
Fisir Profil |
#1 · Zasláno: 5. 5. 2012, 11:49:45
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(); }; }; 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 |
#3 · Zasláno: 5. 5. 2012, 12:57:14
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 |
#4 · Zasláno: 5. 5. 2012, 13:12:29
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 |
#5 · Zasláno: 5. 5. 2012, 13:17:59
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 |
#6 · Zasláno: 5. 5. 2012, 13:35:53
Fisir:
„Které ovšem nenastávají“ Čo ak dáta zo servera prídu až po tom, čo bola funkcia znova volaná? |
||
Fisir Profil |
#7 · Zasláno: 5. 5. 2012, 18:14:25
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 |
#8 · Zasláno: 5. 5. 2012, 18:30:44
Reaguji na Fisira:
Předávej do callbacku rovnou jako argument xmlhttp.responseText , jiné vlastnosti z něj stejně nepotřebuješ.
|
||
Fisir Profil |
#9 · Zasláno: 5. 5. 2012, 18:41:57
Reaguji na Chamurappiho [#8]:
Díky. |
||
Časová prodleva: 12 let
|
0