Autor | Zpráva | ||
---|---|---|---|
suvel Profil |
#1 · Zasláno: 11. 11. 2010, 10:44:16
Zdravím, ve formuláři mám dva inputy, kde se zadává datum. Po vepsání datumu do prvního inputu a kliknutí do druhého inputu proběhne kontrola hodnoty z prvního inputu a když nevyhovuje, měl by se kurzor vrátit do prvního inputu. To se stane v IE, v Mozille zůstane kurzor ve druhém inputu. Prosím, poraďte. Díky.
function datum(formular) { var df = document.getElementById("dod"); kontrola_datumu(this); if(!ok) {df.focus(); return false;} var df = document.getElementById("ddo"); kontrola_datumu(this); if(!ok) {df.focus(); return false;} } function kontrola_datumu() { //tady proběhne kontrola } <form> <INPUT NAME=datum_min id='dod' onchange='return datum(this)'> <INPUT NAME=datum_max id='ddo' onchange='return datum(this)'> </form> |
||
_es Profil |
#2 · Zasláno: 11. 11. 2010, 11:46:31
suvel:
Tá premenná ok tam je na čo?
Myslím, že pri udalosti onchange je jedno, akú hodnotu funkcia vráti.
Do funkcie datum odosielaš objekt this ako argument formular , čo však nebude formulár, ale objekt inputu.
Premennú formular však nepoužívaš a v tej funkcii bude this globálny objekt window .
|
||
suvel Profil |
#3 · Zasláno: 11. 11. 2010, 12:07:00
_es:
- Proměnná ok určuje, jestli je zadaný datum v pořádku. - Při události onchange je skutečně jedno, jakou hodnotu fce vrátí, tady jde jen o focus(), který v IE funguje a v Mozille ne. - Přepsal jsem ve scriptu volání i funkci takto: onchange='datum()' function datum() Zkrátka v IE to funguje, jak bych čekal, v Mozille ne. |
||
_es Profil |
#4 · Zasláno: 11. 11. 2010, 12:19:12 · Upravil/a: _es
suvel:
Skúšal si sa vôbec zamyslieť nad tým, čo som napísal? 4. a 8. riadok je, pri tvojom použití funkcie, to isté ako: kontrola_datumu(window); „Proměnná ok určuje, jestli je zadaný datum v pořádku.“ A "určuje" to na základ čoho, nastavuje sa v tej funkcii kontrola_datumu , ktorej obsah si zatajil?
Žiadnu takú podivnú premennú nepotrebuješ. Máš to celé spravené tak, že v tých funkciách nevieš zistiť, v ktorom inpute nastala tá udalosť a v IE to "funguje" len náhodou a v Mozille to zase len náhodou "nefunguje". |
||
TomasJ Profil |
#5 · Zasláno: 11. 11. 2010, 12:22:33 · Upravil/a: TomasJ
suvel:
taky můžeš místo df.focus(); return false; return df.focus(); if(!ok) if(!kontrola_datumu(this)) No a co toto?: function datum(formular) { var df = document.getElementById("dod"); kontrola_datumu(this); if(!ok) {df.focus(); return false;} var df = document.getElementById("ddo"); kontrola_datumu(this); if(!ok) {df.focus(); return false;} } zakládáš proměnnou 2x ... podruhé stačí jen df=document.... Taky je dost možné, že chyba je v té funkci kontrola_datumu(); |
||
suvel Profil |
#6 · Zasláno: 11. 11. 2010, 13:06:39
_es:
„nevieš zistiť, v ktorom inpute nastala tá udalosť“ var df = document.getElementById("dod"); var df = document.getElementById("ddo"); Pokusil jsem se to tedy napsat tak, jak by to asi správně mělo být, abych vyloučil náhody: function datum() { // První input: var df = document.getElementById("dod"); kontrola_datumu(df); if(!ok) {df.focus(); return false;} // tady ten focus() nefunguje! // Druhý input: df = document.getElementById("ddo"); kontrola_datumu(df); if(!ok) {df.focus(); return false;} } function kontrola_datumu(df) { var ok = true; dtArr = df.value.split("."); if(dtArr.length != 3) { alert("Datum je špatně vyplněno"); ok = false; return ok; } return ok; } <form> <INPUT NAME=datum_min id='dod' onchange='return datum()'> <INPUT NAME=datum_max id='ddo' onchange='return datum()'> </form> Ta kontrola datumu je samozřejmě složitější, ale tam chyba není. A stejně to v Mozille nehlásí žádnou chybu a ten focus() do inputu id='dod' nefunguje. Já už nevím... |
||
_es Profil |
#7 · Zasláno: 11. 11. 2010, 13:30:08
suvel:
Môžeš mi povedať, ako z tých dvoch riadkov kódu zistíš, v ktorom z tých dvoch elementov nastala udalosť onchange ?
Navyše sú zbytočné, objekt vzniku udalosti môžeš detegovať cez this .
Skús trochu viac zapojiť mozog a viac nad tým porozmýšľať, moje rady očividne ignoruješ, nemám dôvod ti viac radiť, celý kód sa mi písať nechce. Očividne tiež nepoznáš rozdiel medzi globálnou a lokálnou premennou, skús si to pozrieť (premenná ok , ktorú napriek rade do toho stále nasilu montuješ).
|
||
suvel Profil |
#8 · Zasláno: 11. 11. 2010, 14:33:53
_es:
Opravdu nejsem expert na JS, nicméně se na to snažím dívat logicky: Myslím, že je jedno, ve kterém z dvou inputů nastala událost onchange. Stejně se kontrolují oba, nejprve první s id="dod" a potom druhý s id="ddo". Když se najde chyba v prvním (a myslím, že je jedno, když si trochu nešikovně pomůžu proměnnou OK - jsem tak nějak zvyklý si předávat mezi funkcemi proměnné), nastane fokus na první id a return. A když se najde chyba v druhém inputu, pak fokus na druhý a return. Třeba to není nejelegantnější řešení, ale logickou chybu v tom nějak pořád nevidím... |
||
suvel Profil |
#9 · Zasláno: 11. 11. 2010, 15:13:32 · Upravil/a: suvel
Protože na to, kde je chyba, chci přijít, script jsem maximálně zjednodušil takto:
<html> <body> <script LANGUAGE="JavaScript"> function datum() { var df = document.getElementById('dod'); alert("Ano, měl bych nastavit kurzor do elementu, který má obsah "+df.value); df.focus(); } </script> <form> <INPUT NAME='datum_min' id='dod' onchange='datum()'> <INPUT NAME='datum_max' id='ddo' onchange='datum()'> </form> </body> </html> Stejně to nefunguje. Prosím, asi se motám v kruhu, nakopněte mně někdo :-) Díky předem. |
||
_es Profil |
#10 · Zasláno: 11. 11. 2010, 15:29:41
A ako zistíš, na ktorom inpute tá "chyba" nastala, ak si to mal spravené tak, že si to mal nezistiteľné?
Nie je to nič zložité, ak to z tých rád nie si schopný pochopiť, tak ti asi nemá zmysel radiť. Toto je asi posledná rada: <html> <script> function datum(e){alert("Udalosť onchange nastala na elemente s id " + e.id); Nejaké ďalšie finty s elementom e } </script> <body> <form> <INPUT NAME=datum_min id='dod' onchange='datum(this)'> <INPUT NAME=datum_max id='ddo' onchange='datum(this)'> </form> </body> </html> |
||
suvel Profil |
#11 · Zasláno: 11. 11. 2010, 16:08:26
_es:
OK, děkuji, nicméně by mělo být jedno, kterou metodu použiju, jestli e.id z this nebo document.getElementById('dod').id, obojí samozřejmě obsahuje totéž. Problém je ale ve focusu: Nechme tedy pro jednoduchost jen jeden input s id='dod'. Proč po změně obsahu inputu a následném kliknutí kamkoli jinam nefunguje document.getElementById('dod').focus()? Událost onchange proběhne, chybu nikde nic nehlásí.... To je jak zakletý zámek. <html> <body> <script> function datum(e) { alert("Je moc hezké, že udalosť onchange nastala na elemente s id " + e.id+" - on už tam stejně žádný jiný není."); document.getElementById('dod').focus(); // Proč tohle nenastaví kurzor do elementu input s id='dod'??? } </script> <body> <form> <INPUT NAME='datum_min' id='dod' onchange='datum(this)'> </form> </body> </html> Takže, prosím, jak je to s tím document.getElementById('dod').focus()? Kde dělám chybu? |
||
_es Profil |
#12 · Zasláno: 11. 11. 2010, 16:33:44 · Upravil/a: _es
suvel:
Aha, Mozilla má asi nejaké odlišné spracovanie akcie a udalosti, teda ten focus vykoná, no potom dokončí tú akciu zmeny, teda ten focus zase zruší.
Toto funguje ako neopustiteľný input: <html> <script> function datum(e) { setTimeout(function(){e.focus();}, 0); // Toto nastane až po ukončení funkcie } </script> <body> <form> <INPUT NAME='datum_min' id='dod' onchange='datum(this)'> </form> </body> </html> onchange nenastane, ak sa obsah nezmení a klikne sa inde, to ešte budeš musieť domyslieť. Môžeš využiť napríklad udalosť onblur .
|
||
suvel Profil |
#13 · Zasláno: 11. 11. 2010, 16:47:46
Jj, takhle už to chodí, moc díky. Uf.
|
||
Časová prodleva: 13 let
|
0