04. august 2007 - 12:02Der 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'); } } } }
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??!
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.
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?!
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?
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
Ok... Så vil jeg da bare sige mange tak for den hurtige, og effektive hjælp...
Synes godt om
Ny brugerNybegynder
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.