Autor Zpráva
user243
Profil
Dobrý den,
potřeboval bych poradit, jak provést kontrolu formuláře se zpožděním třeba půl sekundy; o zpoždění mi jde proto, protože v tu dobu načítám přes ajax kontrolní data ze serveru, které pak porovnávám ve vlastní kontrole formuláře;
document.getElementById("formular").onsubmit = function() {prirazeni(); return false;};

function prirazeni() {
 // spuštění kontroly se zpožděním
       setTimeout(kontrola(), 5000); // 5000 pro test
 
/*
* načítání dat ze serveru a jejich přiřazení jako hodnoty pro určité pomocné inputy typu hidden
*/
}

function kontrola() {
 /*
 * tady probíhá samotná kontrola formuláře, včetně porovnávání s daty z pomocných inputů a pokud je vše v pořádku, javascript formulář odešle
 */
}

formulář se mi kontroluje hned bez nějakého časového prodlení a v tu dobu nemám ještě data ze serveru, i když to testuji na localhostu (ověřeno přes alert()), takže potřeba stisknout submit dvakrát;
díky za rady.
jenikkozak
Profil
Proč data nezkontroluješ až poté, co máš kladnou odpověď ze serveru?
aDAm
Profil
Po submitu si zavolat ty data ze serveru pomocí ajaxu a v onsucess akci si udělat samotné ověření?
_es
Profil
user243:
var formular = document.getElementById("formular");
formular.onsubmit = prirazeni;
function prirazeni() {
/*
* načítání dat ze serveru a jejich přiřazení jako hodnoty pro určité pomocné inputy typu hidden
*/
Nastavíš udalosť príslušnému objektu XMLHttpRequest tak, aby po úspešnom načítaní dát zo servera spustil funkciu kontrola.

return false;
}
user243
Profil
zjistil jsem, že byla chyba mezi klávesnicí a židlí (nedal jsem funkci kontrola do uvozovek)
setTimeout("kontrola()", 5000);

spustit kontrolu až potom, co dostanu data za serveru je určitě elegantnější a jistější, ale jak zajistit, aby se kontrola spustila jen jednou a až budu mít data i z předchozích volání; pokoušel jsem se totiž napsat takovou univerzální funkci pro ajax pro vícero použití, takže by mi vícero volání spouštělo stejný počet kontrol; napadlo mě přidat poslednímu volání ještě parametr, že po úspěšném získání dat má provést kontrolu, ale není tam jistota, že mám i data (aktuální) z předchozího volání;
nebo si myslíte, že spustit víckrát kontrolu v relativně rychlém sledu moc nevadí (v kontrole při chybné hodnotě nastavuji danému inputu focus a protože jde o registraci, ajax posílá data metodou POST)?
_es
Profil
user243:
aby se kontrola spustila jen jednou
Počet kontrol sa snáď dá počítať, alebo nerozumiem, čo myslíš pod tým „len jednou“.

až budu mít data i z předchozích volání
Ak „len jednou“, aké prechádzajúce volania?
user243
Profil
funkce prirazeni totiž vypadá takto:
      function prirazeni() {
      // spuštění kontroly se zpožděním
       setTimeout("kontrola()",500);   
       // přiřazení
       ajax("POST", "XXX.php", "nick=" + nick.value, "nick_", true);
       ajax("POST", "XXX.php", "admin=" + admin.value, "admin_", true);
       
      };
její parametry jsou metoda odesílání, cílová stránka, data, která se mají poslat, id elementu, kam se mají získaná data zapsat a poslední značí použití ve formuláři;
takže takhle získávám data za serveru do pomocných inputů; jsou to dvě volání téže funkce, kde se na sobě nezávisle provede komunikace se serverem a tedy stejně tak práce s objektem XMLHttpRequest;
_es
Profil
user243:
No tak si teda funkciu ajax uprav tak, aby sa ňou dala nastaviť aj iná reakcia na udalosť úspešného vrátenia dát zo servera než len zapísanie vrátených dát do nejakého elementu.
Prečo pre získanie dát vytváraš viac ako jeden HTTP dotaz a nezískaš všetky potrebné dáta z jedného?
user243
Profil
je nějaký způsob volání funkce s parametry, kde jeden z parametrů bude další funkce s parametry?
_es
Profil
user243:
jeden z parametrů bude další funkce s parametry
Jeden z parametrov môže byť funkcia. O parametroch má zmysel sa baviť pri jej definícii, či jej volaní, nie keď je funkcia použitá ako hodnota. Viď aj Časté potíže, zajímavosti a poučné debaty » Rozdíl mezi voláním funkce a funkcí.
user243
Profil
nejsem z toho moudrý, zkoušel jsem to s nedefinovanou funkcí už před tím
ajax("POST", "XXX.php", "nick=" + nick.value, "nick_", true, function("POST", "XXX.php", "admin=" + admin.value, "admin_", true) {ajax(p1, p2, p3, p4, p5, function() {kontrola();});});
kde jsem rozšířil funkci ajax o další parametr; všechno se správně přeneslo, ale nedařilo se mi ji spustit, tak jsem to udělal tak, že na začátku vyresetuji pomocné inputy, pak volám funkci ajax, aby jim přidělila hodnoty a pak spouštím testovací funkci, které zjišťuje, jestli jsou pomocné inputy nastavené; kd
už ne, spustí se znovu za 100ms, a když ano, spustí se kontrola formuláře;
_es
Profil
user243:
A ako máme vedieť, ako tá tvoja funkcia ajax vyzerá? Môžeš trebárs použiť a upraviť si inú funkciu: Univerzální funkce pro AJAX.
Chamurappi
Profil
Reaguji na usera243:
funkce prirazeni totiž vypadá takto
Proč posíláš požadavky dva? To by nešlo posoudit oba údaje najednou?

zkoušel jsem to s nedefinovanou funkcí už před tím
To máš nějaké hodně zamotané. Dát za function do závorek něco jiného než názvy proměnných je vždy chyba.
Zkus si prohlédnout a použít moji funkci na AJAX.
user243
Profil
o Citrónu vím, ale vychází z příkladů na w3schools;
díky Chamurappi, tvůj příklad na call back mi funkci podstatně zjednodušil;
posílal jsem dva požadavky, protože jsem čekal logickou hodnotu; takže teď je posílám současně a odpověď dávám do jednoho inputu, ze kterého porovnávám první a druhý znak řetězce; volání vypadá tedy takto:
ajax("POST", "XXX.php", "nick=" + nick.value + "&admin=" + admin.value, function(odpoved) {document.getElementById("help_input").value = odpoved; kontrola()});
šlo by získat "odpoved" nějak přímo, aby se dalo třeba použít
if (ajax(...)) ...
?
juriad
Profil
user243:
šlo by získat "odpoved" nějak přímo, aby se dalo třeba použít

Nejde to, může za to to první A z názvu AJAX. Pokud by tomu tak bylo, tak by se ti prohlížeč nutně zaseknul do doby než by přišla odpověď, což na pomalé síti můžou být třeba desítky sekund.

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:

0