Autor Zpráva
Canes
Profil
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
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
_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
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
_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
Canes:
Zopakujem:
Prečo nespravíš všetko potrebné v tej anonymnej funkcii priradenej do vlastnosti http.onreadystatechange?
Canes
Profil
_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
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
_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
Canes:
Předej funkci najdiJednotku jako argument funkci pro zpětnou vazbu, až dojde k dokončení požadavku, funkci zavolej.
_es
Profil
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
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.

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: