"Pomalý" AJAX Vyřešeno

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Uživatelský avatar
kuxik009
Level 2.5
Level 2.5
Příspěvky: 338
Registrován: únor 13
Pohlaví: Muž
Stav:
Offline
Kontakt:

"Pomalý" AJAX

Příspěvekod kuxik009 » 22 zář 2015 21:24

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!!
Moje portfolio
Český jazyk je freeware, ale nikoliv open source!!!

Sestava:
► Zobrazit spoiler

Reklama
omilis
Level 1.5
Level 1.5
Příspěvky: 118
Registrován: červenec 09
Pohlaví: Muž
Stav:
Offline

Re: "Pomalý" AJAX

Příspěvekod omilis » 23 zář 2015 16:44

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.

Uživatelský avatar
kuxik009
Level 2.5
Level 2.5
Příspěvky: 338
Registrován: únor 13
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: "Pomalý" AJAX

Příspěvekod kuxik009 » 23 zář 2015 17:07

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.
Moje portfolio
Český jazyk je freeware, ale nikoliv open source!!!

Sestava:
► Zobrazit spoiler

Uživatelský avatar
kuxik009
Level 2.5
Level 2.5
Příspěvky: 338
Registrován: únor 13
Pohlaví: Muž
Stav:
Offline
Kontakt:

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

Příspěvekod kuxik009 » 23 zář 2015 17:47

Takže do toho divu to funguje, díky :)
Moje portfolio
Český jazyk je freeware, ale nikoliv open source!!!

Sestava:
► Zobrazit spoiler


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek

Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 4 hosti