Autor Zpráva
Petr-K
Profil *
Zdravím,
začínám s Javascrptem a AJAXem a potřeboval bych menší radu.

Vytvářím registrační formulář a přihlašovací jméno porovnávám s databází pomocí AJAXu, zda už je již použité jiným uživatelem či nikoliv. Prakticky používám tento script. A narazil jsem na jednu drobnost. Sice to není pravidlem, ale občas se mi stane (cca 1x z 20ti pokusů), že když login napíši velice rychle, tak je poslední znak loginu porovnán rychleji než jeho některý předchádce. A pak, ač login je obsazený (v databázi již existuje), tak script mi vyhodí že je volný.

Můžete mi tedy poradit jak tomuto nešvaru předejít a jak jak porovnávat znak po znaku a nebo třeba porovnat celý řetězec po opuštění inputu kurozrem?

Doufám, že jsem to napsal srozumitelně... :)
Moc děkuji,
Petr
mattyZEM
Profil
Porovnával bych to až po opuštění inputu (nikoliv kurzorem).
Nox
Profil
proč znak po znaku? po tom co člověk přestane psát, tak bych chvílu počkal a teprv pokud nebude dál psát, tak teprve celé pole zkontrolovat... podle mě je zbytečné kontrolovat po každém klepnutí

mimo to je ten PHP skript došt škaredej a s bezpečnostní dírou
Petr-K
Profil *
A můžete mi tedy poradit více konkrétně?
Nox
Profil
mattyZEM => onkeyup -> onblur
Nox => onkeyup if(timeout) clearTimeout(timeout); setTimeout(function(){...}, ...)
Petr-K
Profil *
No, jak jsem říkal, s Javascrptem a AJAXem začínám.... chvíli jsem teď zkoušel a pročítel různé návody. S onBlur jsem si poradil ale s tím setTimeout bohuzel ne.

Když to zapíši podle Noxe tak mi to vypiše chybu: timeout is not defined
<input type="text" name="email" value="" onkeyup="if(timeout) clearTimeout(timeout); timeout = setTimeout(ziskejjmeno(), 2000)" />


a když přidam var timeout, tak mi to zase napíše tuhle chybku: useless setTimeout call (missing quotes around argument?)
input type="text" name="email" value="" onkeyup="var timeout; if(timeout) clearTimeout(timeout); timeout = setTimeout(ziskejjmeno(), 2000) />"


:(
Petr-K
Profil *
Druhý příklad (s var) samozřejmě vypadá takto, bez chyb:
<input type="text" name="email" value="" onkeyup="var timeout; if(timeout) clearTimeout(timeout); timeout = setTimeout(ziskejjmeno(), 2000)" /> 
_es
Profil
<input type="text" name="email" id="email" value="">
<script>
var e = document.getElementById("email"), t;
e.onkeyup = e.onclick = e.onchange = function(){ clearTimeout(t); t = setTimeout(ziskejjmeno, 2000); };
</script>
Petr-K
Profil *
_es
Děkuji Ti, funguje to přesně jak jsem si představoval, nejak se mi AJAKX začíná íbit. :)

Mám nyní dvě laické otázy a nevím zda pro ně otevřít nové téma nebo ne, přijde mi to pro takovou drobnost zbytečné, takže snad to bude ok:
1) jaký je rozdíl mezi těmito zápisy a kdy se používají, postačí nějaký chytrý odkaz:
document.getElementById("email")

a
self.document.forms.registrationForm.email.value


2) z PHP jsem zvyklý, že když volám funkci, tak za jejím názvem píši kulaté závorky, ale v tomto připadě závorky nejsou použity. Ale když je tam doplním tak to také funguje, ale zaroveň to hází chubu. Jak to tedy je?

Děkuji
Nox
Profil
Petr-K:
[#6] psal jsem jen schématicky
[#9]
1) podle mě ne... dle http://diskuse.jakpsatweb.cz/?action=vthread&forum=1&topic=115545&page=-1 by mělo stačit registrationForm.email.value... registrationForm si můžeš třeba předem uložit do proměnné a pracovat tak

2) tady je to proto, že se funkce nevolá... voláme setTimeout(co, za_jak_dlouho) ... agument 'co' může být buď řetězec, což je fuj, nebo funkce

v JS je navíc funkce objekt, takže prostě napíšeme funkci a ona se předá, jako argument funkce se předá objekt-funkce

pokud bys přidal závorky, volalo by se jako argument funkce ziskejjmeno(), takže se v momentě nastavení zjistí hodnota pole a vyjde třeba setTimeout("ano", 2000), což je nesmysl
_es
Profil
Petr-K:
jaký je rozdíl mezi těmito zápisy
Pri prvom zápise sa nájde element podľa atribútu id v celom dokumente.
V druhom zápise sa nájde element podľa atribútu name elementu form a atribútu name nejakého elementu v tom formulári, value je už vlastnosť toho elementu.
Teoreticky by mal byť úplne správne druhý zápis:
document.forms.registrationForm.elements.email
Ale aj ten zápis predtým asi bude fungovať vo všetkých prehliadačoch.

Jak to tedy je?
Stručne vysvetlené to je tu.

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: