Avatar billede xicrow Nybegynder
04. august 2007 - 12:02 Der er 14 kommentarer og
1 løsning

Problemer med IE, mht validering af form!

Hey Eksperter.

Er for nyligt begyndt at lære mig selv JavaScript, da jeg savnede nogle af de JavaScript funktioner jeg har set på andre sider, koder normalt i ASP.

Mit problem er at jeg gerne vil lave det således at JavaScript skal tjekke <input> felter i en formular, samtidig med at brugeren skriver i feltet.
Efter lidt roden rundt med de forskellige events, fik jeg det til at virke perfekt i FireFox, men så prøvede jeg lige i Internet Explorer, og der virker det ikke efter hensigten.

Problembeskrivelse:
FireFox: Her får brugeren en beskrivelse af hvilke kriterier der skal udfyldes for det felt de skriver i, beskrivelse skifter til 'OK' når kriterierne er opfyldt. Og først når alle felter er udfyldt korrekt, kan brugeren trykke på submit knappen (enable / disable)
Internet Explorer: Her kommer der ingen beskrivelse af kriterier, eller 'OK' når kriterierne er opfyldt, men enable/disable af submitknap virker som det skal.

JavaScript kode:
// Function to set focus on a field
function setFocus(field_id) {
document.getElementById(field_id).focus();
}
// Function to write text instantly
function write_text_instant(msg,text) {
document.getElementById(msg).innerHTML = text;
}
// Function to disable element
function disable(element_id) {
document.getElementById(element_id).disabled = true;
}
// Function to enable element
function enable(element_id) {
document.getElementById(element_id).disabled = false;
}
// Function to disable / enable element
function ena_dis(element_id, field_id) {
var field_value = document.getElementById(field_id).value;
name = new Boolean();
adress = new Boolean();
   
if (field_id == "name") {
    if (field_value.length < 5) {
    disable(element_id);
    write_text_instant('name_msg_instant','<font                  style="color:#FF0000;">Must be at least 5 letters (including space)</font>');
    }
    else {
    write_text_instant('name_msg_instant','<font style="color:#00FF00">OK</font>');
    name = true;
    }
}

if (field_id == "adress") {
    if (field_value.length < 6) {
    disable(element_id);
    write_text_instant('adress_msg_instant','<font style="color:#FF0000;">Must be at least 6 letters</font>');
    }
    else {
    write_text_instant('adress_msg_instant','<font style="color:#00FF00">OK</font>');
    adress = true;
    }
}

if (field_id == "zipcode") {
    if (field_value.length != 4) {
    disable(element_id);
    write_text_instant('zipcode_msg_instant','<font style="color:#FF0000;">Must be 4 digits</font>');
    }
    else {;
    write_text_instant('zipcode_msg_instant','<font style="color:#00FF00">OK</font>');
    if ((name = true) && (adress = true)) {
    enable('submit');
    }
}
}
}


HTML kode:
<body onload="setFocus('name');">

<form method="get">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
    <td>
    Name:
    </td>
   
    <td width="10"></td>
   
    <td>
    <input type="text" name="name" id="name" size="30"
    onfocus="ena_dis('submit','name');"
    onblur="ena_dis('submit','name');"
    onkeydown="ena_dis('submit','name');"
    onkeypress="ena_dis('submit','name');"
    onkeyup="ena_dis('submit','name');" />
    <msg id="name_msg_instant" style="color:#FF0000;">&nbsp;</msg>
    </td>
</tr><tr><td height="5"></td></tr><tr>
    <td>
    Adress:
    </td>
   
    <td width="10"></td>
   
    <td>
    <input type="text" name="adress" id="adress" size="30"
    onfocus="ena_dis('submit','adress');"
    onblur="ena_dis('submit','adress');"
    onkeydown="ena_dis('submit','adress');"
    onkeypress="ena_dis('submit','adress');"
    onkeyup="ena_dis('submit','adress');" />
    <msg id="adress_msg_instant" style="color:#FF0000;">&nbsp;</msg>
    </td>
</tr><tr><td height="5"></td></tr><tr>
    <td>
    Zipcode:
    </td>
   
    <td width="10"></td>
   
    <td>
    <input type="text" name="zipcode" id="zipcode" size="30"
    onfocus="ena_dis('submit','zipcode');"
    onblur="ena_dis('submit','zipcode');"
    onkeydown="ena_dis('submit','zipcode');"
    onkeypress="ena_dis('submit','zipcode');"
    onkeyup="ena_dis('submit','zipcode');" />
    <msg id="zipcode_msg_instant" style="color:#FF0000;">&nbsp;</msg>
    </td>
</tr><tr><td height="5"></td></tr><tr>
    <td colspan="2"></td>
   
    <td>
    <input type="submit" id="submit" value="Submit" />
    <input type="reset" id="reset" value="Reset and Reload" onclick="java script:window.location.reload();" />
    </td>
</tr>
</table>
</form>

</body>
Avatar billede erikjacobsen Ekspert
04. august 2007 - 12:10 #1
Findes der et <msg>-tag?
Avatar billede xicrow Nybegynder
04. august 2007 - 12:15 #2
Nej, men bruger aldrig <p> på grund af linie skift, og så skal jeg til at ændre det i CSS, og med et <div> stod den også forkert...

Men prøvede da også for god ordens skyld, at lave det til en <div> og <p>, men virker stadig ikke...
Avatar billede erikjacobsen Ekspert
04. august 2007 - 12:20 #3
Så hvis du ved der ikke findes et <msg>-tag, så undrer du dig alligevel over det ikke virker...? Det er det sjovest jeg har hørt i dag ;)

Brug et <span>  - det er måske hvad FF tror du mener.
Avatar billede erikjacobsen Ekspert
04. august 2007 - 12:23 #4
Og så er det i hvert fald ikke
    if ((name = true) && (adress = true)) {
men
    if ((name == true) && (adress == true)) {
Avatar billede xicrow Nybegynder
04. august 2007 - 12:24 #5
Sorry, det virker nu... beklager min umiddelbare uvidenhed...

Men kan du måske hjælpe med et andet problem jeg er løbet ind i, pointen med dette script er at brugeren ikke skal have muligheden for at sende informationerne, før alle felter er udfyldt korrekt, men har lige opdaget at man kan lade de første 2 felter være tomme, og så blot udfylde den sidste, og så får man alligevel lov til at klikke på submit knappen??!
Avatar billede xicrow Nybegynder
04. august 2007 - 12:26 #6
Havde jeg også en mistanke om, men så enable() den ikke submit knappen???
Avatar billede erikjacobsen Ekspert
04. august 2007 - 12:28 #7
Jamen, det er også helt forkert logik mht name og adress. Din gamle version virker kun hvis man udfylder i rækkefølge, zip til sidst. Prøv at udfylde zip først, med de to andre tomme. Prøv at se på din kode: du aflæse ikke om name eller adress er ok, hvis du kun går ind med zip. Du skal aflæse felterne hver gang for at se om de er ok eller ej.
Avatar billede xicrow Nybegynder
04. august 2007 - 12:32 #8
vil det sige at jeg skal tjekke alle felterne, ved hvert felt?

onfocus="ena_dis('submit','name'); ena_dis('submit','adress'); ena_dis('submit','zipcode');"

osv...
Avatar billede xicrow Nybegynder
04. august 2007 - 12:35 #9
Har lavet min ena_dis() funktion om til det her:
function ena_dis(element_id, field_id) {
    var field_value = document.getElementById(field_id).value;
    name = new Boolean(false);
    adress = new Boolean(false);
    zipcode = new Boolean(false);
   
    if (field_id == "name") {
        if (field_value.length < 5) {
            disable(element_id);
            write_text_instant('name_msg_instant','<font style="color:#FF0000;">Must be at least 5 letters (including space)</font>');
            }
        else {
            write_text_instant('name_msg_instant','<font style="color:#00FF00">OK</font>');
            name = true;
            }
        }
    if (field_id == "adress") {
        if (field_value.length < 6) {
            disable(element_id);
            write_text_instant('adress_msg_instant','<font style="color:#FF0000;">Must be at least 6 letters</font>');
            }
        else {
            write_text_instant('adress_msg_instant','<font style="color:#00FF00">OK</font>');
            adress = true;
            }
        }
    if (field_id == "zipcode") {
        if (field_value.length != 4) {
            disable(element_id);
            write_text_instant('zipcode_msg_instant','<font style="color:#FF0000;">Must be 4 digits</font>');
            }
        else {;
            write_text_instant('zipcode_msg_instant','<font style="color:#00FF00">OK</font>');
            zipcode = true;
            }
        }
    if ((name == true) && (adress == true) && (zipcode == true)) {
        enable(element_id);
        }
    }

Men skal jeg så tjekke alle felter i formularen, ved hvert felt?!
Avatar billede xicrow Nybegynder
04. august 2007 - 12:55 #10
Ok... nu har jeg endelig fået det til at virke som det skal, næsten.
Jeg har omskrevet min funtion til dette:
// Function to disable / enable element
function ena_dis(element_id, field_id) {
    var x=document.getElementById("testForm");
    disable(element_id);
   
    for (var i=0;i<x.length;i++) {
        var field_value = document.getElementById(x.elements[i].id).value;
        if (x.elements[i].id == "name") {
            if (field_value.length < 5) {
                write_text_instant('name_msg_instant','<font style="color:#FF0000;">Must be at least 5 letters (including space)</font>');
                }
            else {
                write_text_instant('name_msg_instant','<font style="color:#00FF00">OK</font>');
                name = true;
                }
            }
        if (x.elements[i].id == "adress") {
            if (field_value.length < 6) {
                write_text_instant('adress_msg_instant','<font style="color:#FF0000;">Must be at least 6 letters</font>');
                }
            else {
                write_text_instant('adress_msg_instant','<font style="color:#00FF00">OK</font>');
                adress = true;
                }
            }
        if (x.elements[i].id == "zipcode") {
            if (field_value.length != 4) {
                write_text_instant('zipcode_msg_instant','<font style="color:#FF0000;">Must be 4 digits</font>');
                }
            else {;
                write_text_instant('zipcode_msg_instant','<font style="color:#00FF00">OK</font>');
                zipcode = true;
                }
            }
        }
    if ((name == true) && (adress == true) && (zipcode == true)) {
        enable(element_id);
        }
    }

Men nu er det jo så at jeg gerne vil have at der kun står en besked ud for det felt, brugeren skriver i (der er fokus på), men som det er nu skriver den det for alle felter, kan man tjekke hvilket felt der er fokus på? og hvordan?
Avatar billede xicrow Nybegynder
04. august 2007 - 13:04 #11
Men du må meget gerne smide et svar erikjacobsen, så du kan få point for din indsats..
Avatar billede erikjacobsen Ekspert
04. august 2007 - 13:30 #12
Jeg samler slet ikke på point, tak.

Du kan nok checke på field_id om du skal skrive en tekst for feltet.
Avatar billede xicrow Nybegynder
04. august 2007 - 13:41 #13
Prøvede jeg da også, men kom så lige til at kigge scriptet efter, og den løber jo igennem alle felterne i formen, så teksten stod igen ved alle felter....

Men har løst problemet nu, kalder bare funktionen med et id, eks.:
// Kalder funktionen fra første felt (name)
ena_dis('submit','testForm','1')

// Kalder funktionen fra andet felt (adress)
ena_dis('submit','testForm','2')

Så tjekker jeg bare med det id, og det virker som det skal...


Men smid da lige et svar alligevel, syntes nu du skal have noget for at mit bøvl :) :P
Avatar billede erikjacobsen Ekspert
04. august 2007 - 13:46 #14
Jo, men jeg samler slet ikke på point. Svar selv, accepter eget svar, og brug dine point til noget andet.
Avatar billede xicrow Nybegynder
04. august 2007 - 13:48 #15
Ok... Så vil jeg da bare sige mange tak for den hurtige, og effektive hjælp...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester