Autor Zpráva
suvel
Profil
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
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
_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()'
a
function datum()
a nezměnilo se nic.
Zkrátka v IE to funguje, jak bych čekal, v Mozille ne.
_es
Profil
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
suvel:
taky můžeš místo
df.focus(); return false;
dát
 return df.focus();
a místo
if(!ok)
dát
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
_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
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
_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
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
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
_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
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>
Ešte drobný nedostatok, udalosť 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
Jj, takhle už to chodí, moc díky. Uf.

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:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0