Autor | Zpráva | ||
---|---|---|---|
Canes Profil |
#1 · Zasláno: 22. 1. 2011, 10:40:25 · Upravil/a: Canes
Dobrý den,
mám problém s následující funkcí, když ji chci zapsat do dokumentu. Mám tušení, že se vezme aktuální stav funkce, který je asi "undefined" a ten se ihned zapíše. Poradíte mi, jak by mohlo zapsání do dokumentu počkat na funkci a její readyState? function najdiJednotku(velicina) { var http = false; if(navigator.appName == "Microsoft Internet Explorer") { http = new ActiveXObject("Microsoft.XMLHTTP"); } else { http = new XMLHttpRequest(); } http.abort(); http.open("GET", "najdi.php?velicina=" + velicina, true); http.onreadystatechange=function() { if(http.readyState == 4) { return http.responseText; } } http.send(null); } document.getElementById("hodnoty").innerHTML = najdiJednotku(veliciny[i]); edit: opravena závorka |
||
_es Profil |
#2 · Zasláno: 22. 1. 2011, 11:48:19 · Upravil/a: _es
Canes:
„že se vezme aktuální stav funkce“ Nič také, ako „aktuálny stav funkcie“ v JS neexistuje. V kóde, čo si vložil, chýba jedna zátvorka } .
„= najdiJednotku(veliciny[>i]);“ Ale tvoja funkcia najdiJednotku nevracia žiadnu hodnotu, preto je výsledok undefined. Trochu je to vysvetlené tu.
|
||
Canes Profil |
#3 · Zasláno: 22. 1. 2011, 12:20:36
_es:
„chýba jedna zátvorka }“ Špatně jsem to zkopíroval, závorku v originále mám. Tvůj odkaz jsem prostudoval ještě před odesláním dotazu, moc mi nepomohl. Nechápu, proč když mám ve funkci "return", tak je hodnota té funkce undefined. Zkoušel jsem dát místo return http.responseText; toto alert(http.responseText); a hláška mi řekla vše, co se říct mělo. Proměnná "http.responseText" tedy má nějakou hodnotu. Netuším, proč se to samé nestane s return. Zkusil jsem také http.responseText nahradit obyčejným řetězcem "ahoj", ale funkce se chová, jakoby v ní žádný return nebyl. |
||
_es Profil |
#4 · Zasláno: 22. 1. 2011, 12:35:27 · Upravil/a: _es
Canes:
„Nechápu, proč když mám ve funkci "return", tak je hodnota té funkce undefined.“ Vo funkcii najdiJednotku príkaz return nemáš.
Teda je príkaz return v tej nepomenovanej funkcii, ktorej návratová hodnota je však nevyužitá, a funkcia najdiJednotku hodnotu nevracia.
Ďalej nechápem, načo si tam vložil príkaz http.abort() .
„Proměnná "http.responseText"“ To nie je premenná. Prečo nespravíš všetko potrebné v tej anonymnej funkcii priradenej do vlastnosti http.onreadystatechange ?
Mal by si si trochu naštudovať základy JS, alebo aspoň pozornejšie čítať. |
||
Canes Profil |
#5 · Zasláno: 22. 1. 2011, 13:12:40
_es:
Zkopíroval jsem kód a trochu poupravil, ale úplně mu neporozuměl. http.abort() je mi tam vlastně nanic. Díky Teď už to myslím chápu a zeptám se jinak. Jak dostanu tu hodnotu http.responseText do funkce najdiJednotku? Když je to anonymní funkce, tak se k ní vlastně nedostanu, že? Jak si ji potom nějak pojmenuju, abych mohl v najdiJednotku dát return taAnonymniFunkce() a potom použít funkci najdiJednotku jako nějakou hodnotu? |
||
_es Profil |
#6 · Zasláno: 22. 1. 2011, 13:18:51
Canes:
Zopakujem: Prečo nespravíš všetko potrebné v tej anonymnej funkcii priradenej do vlastnosti http.onreadystatechange ?
|
||
Canes Profil |
#7 · Zasláno: 22. 1. 2011, 14:08:08 · Upravil/a: Canes
_es:
Protože mám cyklus, ve kterém vypisuji určité veličiny do inputů a k nim potřebuju přiřazovat z databáze jednotky. Šlo by to v té anonymní funkci přiřadit do nějaké globální proměnné a tu potom použít, ale to mi nepřijde moc elegantní. Celý kód: function najdiJednotku(velicina) { var http = false; if(navigator.appName == "Microsoft Internet Explorer") { http = new ActiveXObject("Microsoft.XMLHTTP"); } else { http = new XMLHttpRequest(); } http.open("GET", "najdi.php?velicina=" + velicina, true); http.onreadystatechange = function() { if(http.readyState == 4) { return http.responseText; } } http.send(null); }; function inputVzorec(citatel, jmenovatel){ var citatele = citatel.split(" "); var jmenovatele = jmenovatel.split(" "); var veliciny = citatele.concat(jmenovatele); document.getElementById("tableHodnoty").innerHTML = ""; for (i=0; i < veliciny.length; i++){ zapis = "<tr><td>"+veliciny[i]+"</td>"; zapis += "<td><input class='velicinyInput' name='"+veliciny[i]+"' type='text' value='"+veliciny[i]+"'> </td>"; zapis += "<td> "+najdiJednotku(veliciny[i])+" </td>"; // tady chci vložit jednotku k určité veličině zapis += "</tr>"; document.getElementById("tableHodnoty").innerHTML += zapis; }; }; |
||
_es Profil |
#8 · Zasláno: 22. 1. 2011, 14:16:13
Canes:
Objekt XMLHttpRequest (obvykle) pracuje asynchrónne, môže pracovať aj synchrónne, no nie je to dobrý nápad. Tvoja aplikácia má celkovo zlý návrh, skús si nájsť nejaké vzorové ukážky a články AJAXu. Bez znalosti základov JavaScriptu sa ďalej nepohneš a nemôžeš čakať, že ti ich tu bude niekto vysvetľovať. |
||
Canes Profil |
#9 · Zasláno: 22. 1. 2011, 14:22:22
_es
Ok, už je to dlouho, co jsem si četl základy js a ajaxu. Asi se tam vrátím. Díky za tvůj čas. |
||
Witiko Profil |
#10 · Zasláno: 22. 1. 2011, 15:54:53
Canes:
Předej funkci najdiJednotku jako argument funkci pro zpětnou vazbu, až dojde k dokončení požadavku, funkci zavolej. |
||
_es Profil |
#11 · Zasláno: 22. 1. 2011, 16:04:07
Witiko:
„Předej funkci najdiJednotku jako argument funkci pro zpětnou vazbu, až dojde k dokončení požadavku, funkci zavolej.“ Funkcií tam má dosť, potrebuje sa v tom len vyznať, aj spätnú väzbu tam má, len nerobí to, čo treba. Nepotrebuje vytvárať nejakú ďalšiu funkciu, s ktorou to len skomplikuje. |
||
Canes Profil |
#12 · Zasláno: 22. 1. 2011, 16:17:49
Vyřešil jsem to tak, že jsem si nejdřív vytvořil celou tabulku s volnými buňkami pro jednotky, zapsal ji do HTML a až poté jsem zavolal funkci najdiJednotku. V ní vnořená anonymní funkce rovnou zapíše data do připravených buněk a problém vyřešen. Sice ne tak, jak jsem si to představoval, ale moje představy byly asi nereálné.
Díky pánové, přeji hezký večer. |
||
Časová prodleva: 13 let
|
0