Avatar billede xicrow Nybegynder
06. august 2007 - 09:13 Der er 12 kommentarer og
1 løsning

Problemer med IE!

Hej Eksperter.

Jeg er ved at lave et JavaScript til at tjekke formularinfo, samtidig med at brugeren skriver i felterne, men jeg er løbet i et problem med Internet Explorer.

Jeg har lavet scriptet således at submit knappen er disablet indtil alle felter i formularen er udfyldt korrekt, og det virker også fint nok i FireFox, men i Internet Explorer bliver submit knappen ikke enabled igen...

Er der nogen der kan sige mig hvorfor? Har hørt noget om at IE skal have special behandling, men er først lige begyndt at lære JavaScript, så kender ikke genvejene, hvis der skulle være nogen...

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, form_id, call_id) {
    var x = document.getElementById(form_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) || (isNaN(field_value) == false)) {
                if (call_id >= 1) {
                    write_text_instant('name_msg_instant','<font style="color:#FF0000;">Must be at least 5 letters</font>' +name);
                    }
                name = false;
                }
            else {
                write_text_instant('name_msg_instant','<font style="color:#00FF00">OK</font>' +name);
                name = true;
                }
            }
        if (x.elements[i].id == "adress") {
            if ((field_value.length < 6) || (isNaN(field_value) == false)) {
                if (call_id >= 2) {
                    write_text_instant('adress_msg_instant','<font style="color:#FF0000;">Must be at least 6 letters</font>' +adress);
                    }
                adress = false;
                }
            else {
                write_text_instant('adress_msg_instant','<font style="color:#00FF00">OK</font>' +adress);
                adress = true;
                }
            }
        if (x.elements[i].id == "zipcode") {
            if ((field_value.length != 4) || (isNaN(field_value) == true)) {
                if (call_id >= 3) {
                    write_text_instant('zipcode_msg_instant','<font style="color:#FF0000;">Must be 4 digits</font>' +zipcode);
                    }
                zipcode = false;
                }
            else {;
                write_text_instant('zipcode_msg_instant','<font style="color:#00FF00">OK</font>' +zipcode);
                zipcode = true;
                }
            }
        }
    if ((name == true) && (adress == true) && (zipcode == true)) {
        enable(element_id);
        }
    if ((name == false) || (adress == false) || (zipode == false)) {
        disable(element_id);
        }
    }


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

<form method="post" id="testForm">
<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','testForm','1');"
    onblur="ena_dis('submit','testForm','1');"
    onkeydown="ena_dis('submit','testForm','1');"
    onkeypress="ena_dis('submit','testForm','1');"
    onkeyup="ena_dis('submit','testForm','1');" />
    <span id="name_msg_instant" style="margin:0px; padding:0px;">&nbsp;</span>
    </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','testForm','2');"
    onblur="ena_dis('submit','testForm','2');"
    onkeydown="ena_dis('submit','testForm','2');"
    onkeypress="ena_dis('submit','testForm','2');"
    onkeyup="ena_dis('submit','testForm','2');" />
    <span id="adress_msg_instant" style="margin:0px; padding:0px;;">&nbsp;</span>
    </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','testForm','3');"
    onblur="ena_dis('submit','testForm','3');"
    onkeydown="ena_dis('submit','testForm','3');"
    onkeypress="ena_dis('submit','testForm','3');"
    onkeyup="ena_dis('submit','testForm','3');" />
    <span id="zipcode_msg_instant" style="margin:0px; padding:0px;">&nbsp;</span>
    </td>
</tr><tr><td height="5"></td></tr><tr>
    <td colspan="2"></td>
   
    <td>
    <input type="submit" name="submit" id="submit" value="Submit" />
    <input type="reset" name="reset" id="reset" value="Reset and Reload" onclick="java script:window.location.reload();" />
    </td>
</tr>
</table>
</form>

<%
response.write "Name: " &request.form("name")& "<br />"
response.write "Adress: " &request.form("adress")& "<br />"
response.write "Zipcode: " &request.form("zipcode")
%>

</body>
Avatar billede xicrow Nybegynder
06. august 2007 - 09:16 #1
Skulle nok lige sige at for at tjekke, tjekke igen, og tjekke lidt mere, så har jeg ved hver meddelelse vedrørende det felt brugeren skriver i, også skrevet værdien af den variable jeg sætter til det felt, for at få bekræftet at nedenstående IF'er burde virke:
if ((name == true) && (adress == true) && (zipcode == true)) {
    enable(element_id);
    }
if ((name == false) || (adress == false) || (zipode == false)) {
    disable(element_id);
    }

Når alle felterne er udfylt korrekt, er variablerne "true"...
Så jeg er lidt på bar bund med hvorfor det ikke virker
Avatar billede erikjacobsen Ekspert
06. august 2007 - 09:53 #2
Du skal nok i stedet for
  for (var i = 0; i < x.length; i++) {
have
  for (var i = 0; i < x.elements.length; i++) {

Og sæt så nogle testalerts ind:
  alert("i = " + i);
så du kan følge med i hvad der sker. Fjern dem ikke med det samme, men sæt en kommentar foran.
  alert("i = " + i);
Så har du en chance for at følge med.
Avatar billede erikjacobsen Ekspert
06. august 2007 - 09:53 #3
Og det med kommenateren er s'f'li':
  //alert("i = " + i);
Avatar billede xicrow Nybegynder
06. august 2007 - 10:06 #4
Er ikke lige helt med på hvor jeg skal sætte den alert() ind henne, får ca 5 alerts hver gang jeg trykke på en tast!?

Efter jeg har lavet:
  for (var i = 0; i < x.length; i++) {
om til:
  for (var i = 0; i < x.elements.length; i++) {

og jeg har udfyldt de første 2 felter korrekt, får jeg af vide at 'zipcode er ikke defineret'???
Avatar billede xicrow Nybegynder
06. august 2007 - 10:09 #5
Koden virker nu i IE, og ser sådan ud:
function ena_dis(element_id, form_id, call_id) {
    var x = document.getElementById(form_id);
    var name = false;
    var adress = false;
    var zipcode = false;
   
    for (var i = 0; i < x.elements.length; i++) {
        var field_value = document.getElementById(x.elements[i].id).value;
        if (x.elements[i].id == "name") {
            if ((field_value.length < 5) || (isNaN(field_value) == false)) {
                if (call_id >= 1) {
                    write_text_instant('name_msg_instant','<font style="color:#FF0000;">Must be at least 5 letters</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) || (isNaN(field_value) == false)) {
                if (call_id >= 2) {
                    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) || (isNaN(field_value) == true)) {
                if (call_id >= 3) {
                    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);
        }
    if ((name == false) || (adress == false) || (zipode == false)) {
        disable(element_id);
        }
    }

Men jeg får stadig fejlen efter at jeg har udfyldt 2 felt?!
Avatar billede xicrow Nybegynder
06. august 2007 - 10:11 #6
Sry, min fejl zipcode <> zipode... =)

Og du var ikke meget for at få point, hvis jeg husker rigtigt?
Avatar billede xicrow Nybegynder
06. august 2007 - 10:51 #7
Ok... det går jeg ud fra...
Avatar billede erikjacobsen Ekspert
06. august 2007 - 10:51 #8
Du skal sætte alerts ind på interessante steder, fx først i en løkke, så du kan se om den kommer derind, og hvor mange gange - bare mens du debugger.
Nej tak, ingen point til mig.
Avatar billede olebole Juniormester
06. august 2007 - 12:56 #9
<ole>

- og specielt i løkker kan det godt betale sig at:
    for ( ... ) {
        if (confirm("vil du have endnu en alert?")) alert("Et eller andet");
        else break;
    }

/mvh
</bole>
Avatar billede olebole Juniormester
06. august 2007 - 12:57 #10
- eller bruge confirm-boksen direkte:
    for ( ... ) {
        if (!confirm("Skal vi fortsætte?")) break;
    }
Avatar billede erikjacobsen Ekspert
06. august 2007 - 13:26 #11
Du kan ikke lide sådan een Ole?:
    while (1) alert(2);
I Opera kan man i alert-boksen stoppe javascript.
Avatar billede olebole Juniormester
06. august 2007 - 13:35 #12
I går aftes sad jeg med et script, der skulle loope gennem et array med 400 pladser - og der skulle testes undervejs ... NEJ, JEG KAN IKKE LIDE ALERTS LANGE LØKKER ...!!! Undskyld versalerne  ;o)

- nå, men man får da motioneret sin TaskManager ... indtil ordet 'confirm' pludselig dukker op mellem de hårdtristede, forrøgede, mokkafarvede celler  :D
Avatar billede olebole Juniormester
06. august 2007 - 13:48 #13
I øvrigt har jeg hørt et rygte om at MS købte netop dén feature af Opera. De ville bruge den på deres Mac-versioner af Explorer ... den skulle bare virke modsat, så man kunne slå JS til ved alert-boks.
Efter i otte år at have slåsset med at få en alert-boks frem uden JS slået til opgav de at få JS til at virke i MacOS/IE - og opgav efterfølgende helt IE til Mac ... *gnæk-gnæk*  ;o)
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