Stránka 1 z 1

"Pomalý" AJAX

Napsal: 22 zář 2015 21:24
od kuxik009
Zdravím,
právě řeším jeden zapeklitý problém. Po kliknutí na tlačítko chci ověřit, zda zadaná hodnota existuje v databázi - tudíž používám AJAX a php, abych se vyhnul znovunačtení stránky. Jenže AJAX mi vždy vrací výsledky "zpožděně". Vysvětlím ještě později:

Kód: Vybrat vše

 <input type="button" value="Odeslat zprávu - dvojklik" onclick="this.value='Odeslat zprávu'; zkontroluj_posta_form();" id="tlacitko_odeslani"
 ...
 function zkontroluj_posta_form()
  {
   var prezdivka = osetri_retezec(document.getElementById("prijemce").value);
     ...
                  vysledky = ajax_vratit_stranku("posta_ajax.php", "id_ze_jmena", prezdivka);
                  if (vysledky.indexOf("neexistuje") >= 0)
                   {
                    alert("retarde");
                   }
                    else
                     {
                      alert ("neretarde");
                     }
  }
  ....
  function ajax_vratit_stranku(script, nazev_postu, hodnota_postu)
{
    if ((typeof nazev_postu === 'undefined') || (typeof hodnota_postu === 'undefined'))
    {
        nazev_postu = "";
        hodnota_postu = "";
    }
    var xhr;
    if (window.XMLHttpRequest)
    {
        xhr = new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
        xhr = new ActiveXObject("Msxml2.XMLHTTP");
    }
    else
    {
        throw new Error("Ajax není podporován! Zkuste jiný prohlížeč...");
    }
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4) {
            if (xhr.status == 200 && xhr.status < 300) {
                odpoved = xhr.responseText;
            }
        }
    }
    xhr.open('POST', script);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr.send(nazev_postu+"="+hodnota_postu);
    return odpoved;
}


Prakticky jde o to, že po kliknutí se z pole vezme proměnná prezdivka, která se jako parametr hodí ajaxové funkci, která ji zase POSTem pošle PHP skriptu, ten ji vytáhne z databáze, a vypíše "neexistuje" pokud uživatel neexistuje. No a odpověď skriptu si AJAX načte do proměnné odpoved, kterou potom vrátí a na základě vrácené hodnoty hodí JS alert. (zatím spíš zkouším funkčnost než krásné chybové hlášky :oops: )

Jenže problém je v tom, že ajax má vždy "jedno kolo zpoždění". Když kliknu poprvé, nic se nestane - vůbc žádný alert. Na podruhé to už funguje, jenže problém je, když změním hodnotu inputu. To mi totiž při kliknutí vrací výsledky předchozího kliknutí (např. když mám v db jen uživatele Kuba, do políčka napíšu Kuba. Napřed se nic nestane, napodruhé napíše, že existuje. Jenže když přepíšu na Jirka a znova kliknu, opět napíše, že existuje, a až napodruhé, že ne).

Řekl bych, že problém bude v tom, že se proměnná odpoved ve funkci nestíhá definovat. Zkoušel jsem tudíž i třeba

Kód: Vybrat vše

setTimeout(function () {return odpoved;}, 200)
, aby stihnul AJAX natahat data, ale to vůbec nefungovalo.

Víte prosím někdo, jak na to? Ajaxu moc nerozumím, funkci mám víceméně zkopírovanou. Děkuji moc!!

Re: "Pomalý" AJAX

Napsal: 23 zář 2015 16:44
od omilis
Ten alert musíš dělat v handleru onreadystatechange. Tzn. místo pouhého nastavení proměnné odpoved musíš udělat vše, co se má s odpovedí provést.

SetTimeout ti nefunguje, protože je to jiná fuknce. Odpoved vrací funkce definována uvnitř setTimeout a ne ajax_vratit_stranku.

Re: "Pomalý" AJAX

Napsal: 23 zář 2015 17:07
od kuxik009
Aha takhle. Napadlo mě dát ten return do onreadystatechange, ale to taky nefungovalo. Když to teda musí být takhle, překopu si tu funkci i na vyhodnocování výsledků.

edit: tak mě napadlo - když do toho onreadystatechange dám innerHTML, tak to funguje. Takže kdybych dal innerText a načetl výsledek do skrytého divu (s display: none), tak bych potom vlastně jenom mohl vybrat obsah toho divu, ne? Vím, není to moc bezpečné, ale nechci přenášet žádná hesla, jen "existuje"/"neexistuje". Zkusím to, a dám vědět.

Re: "Pomalý" AJAX  Vyřešeno

Napsal: 23 zář 2015 17:47
od kuxik009
Takže do toho divu to funguje, díky :)