"Pomalý" AJAX
Napsal: 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:
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
)
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
, 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!!
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

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)
Víte prosím někdo, jak na to? Ajaxu moc nerozumím, funkci mám víceméně zkopírovanou. Děkuji moc!!