Avatar billede learnie Nybegynder
31. marts 2002 - 17:53 Der er 5 kommentarer og
1 løsning

IE fryser ved submit

Jeg har en form med textfelter, som skal valideres onsubmit. Følgende felter indgår:

Fakturanr. (skal udfyldes)
Fakturadato (skal udfyldes med bestemt format)
Dato1 (skal udfyldes), Timer1  (skal udfyldes)
Dato2 (valgfri), Timer2 (valgfri)
...
Dato6 (valgfri), Timer6 (valgfri)

Hvis Dato2 er udfyldt skal Timer2 også udfyldes og omvendt, osv.

Onsubmit kaldes følgende funktion:

function chkfrm(frm) {
if (frm.fakturanr.value == "") {
    alert("Skriv en værdi for feltet \"Fakturanr\".");
    frm.fakturanr.focus();
    return false;
}
if (frm.fakturadato.value == "") {
    alert("Skriv en værdi for feltet \"Fakturadato\".");
    frm.fakturadato.focus();
    return false;
}
if (frm.fakturadato.value.length!=10) {
    alert("Datoformatet skal være: dd-mm-aaaa");
    frm.fakturadato.focus();
    return false;
}
if (frm.fakturadato.value.charAt(2)!="-" || frm.fakturadato.value.charAt(5)!="-") {
    alert("Datoformatet skal være: dd-mm-aaaa");
    frm.fakturadato.focus();
    return false;
}
var tmp = 0
for (i=1; i<=6; i++) {
    var dato = eval('frm.dato' + i);
    var timer = eval('frm.timer' + i);
    if (dato.value!="" && timer.value!="") {
        tmp = 1
        if (dato.value.length!=10) {
            alert("Datoformatet skal være: dd-mm-aaaa");
            dato.focus();
            return false;
        }
        if (dato.value.charAt(2)!="-" || dato.value.charAt(5)!="-") {
            alert("Datoformatet skal være: dd-mm-aaaa");
            dato.focus();
            return false;
        }

        var checkOK = "0123456789,";
        var checkStr = timer.value;
        var allValid = true;
        for (i=0; i<checkStr.length; i++) {
              ch = checkStr.charAt(i);
              for (j=0; j<checkOK.length; j++)
                  if (ch == checkOK.charAt(j))
                      break;
                  if (j == checkOK.length) {
                      allValid = false;
                      break;
                  }
              }
              if (!allValid) {
                  alert("Værdien for \"Timer\" skal være et tal.\n\nFølgende tegn er lovlige: 0123456789,");
                  timer.focus();
                  return false;
              }
        }
        if ((dato.value!="" && timer.value=="") || (timer.value!="" && dato.value=="")) {
              if (dato.value == "") {
                  alert("Skriv en værdi for feltet \"Rådgivningsdato\".");
                  dato.focus();
                  return false;
              }
              if (dato.value.length!=10) {
                  alert("Datoformatet skal være: dd-mm-aaaa");
                  dato.focus();
                  return false;
              }
              if (dato.value.charAt(2)!="-" || dato.value.charAt(5)!="-") {
                  alert("Datoformatet skal være: dd-mm-aaaa");
                  dato.focus();
                  return false;
              }
              if (timer.value == "") {
                  alert("Skriv en værdi for feltet \"Timer\".");
                  timer.focus();
                  return false;
              }
        }
    }
    if (tmp==0) {
        alert("Der er ikke foretaget en indberetning af timer.");
        frm.dato1.focus();
        return false;
    }   
    return true;
}

Problemet er at flere brugere har klaget over at deres browser fryser i et stykke tid ved submit, og de får en prompt med beskeden om at IE kører langsom og det kan medføre problemer og påvirke input. Min fornemmelse siger mig, at det må være funktionen chkfrm(frm) der er årsagen. Men hvorfor?

Ud over at samle alle fejlmeddelser i én alert(), er der så forslag/hjælp til forbedring af scriptet?
Avatar billede olebole Juniormester
31. marts 2002 - 18:47 #1
<ole>
Prøv aller først at ændre variablen fra 'i' til 'j' i din anden for-løkke. Den ligger jo inde i den første og kan let give noget ged.
Prøv derefter - hvis det ikke hjalp - at hænge en URL her.
/mvh
</bole>
Avatar billede olebole Juniormester
31. marts 2002 - 18:50 #2
hmmmm ..... 'j' har du også brugt i forvejen. Prøv at kalde dem 'i', 'j' og 'k'.
Altså: Alle for-løkker inde i hinanden skal heve unik optællings-variabel.
/mvh
Avatar billede olebole Juniormester
31. marts 2002 - 19:13 #3
Den 'tal-checker' har du vist aldrig set virke  :o)
Prøv det her i stedet:

    var checkOK = "0123456789,";
    var checkStr = timer.value;
    var allValid = true;
    for (j=0; j<checkStr.length; j++) {
        if ( checkOK.indexOf(checkStr.charAt(j)) == -1 ) {
            alert("Værdien for \"Timer\" skal være et tal.\nFølgende tegn er lovlige:\n\n\40\40\40\40 0 1 2 3 4 5 6 7 8 9");
            timer.focus();
            return false;
        }
    }

/mvh
Avatar billede learnie Nybegynder
31. marts 2002 - 21:22 #4
Mine for-løkke-variable er nu ændret, tak for det. Jeg har testet gud ved hvor mange gange og har ikke selv oplevet fejlen og ved derfor ikke om det ændre situationen. Men kan det være årsagen til at siden fryser? En URL kan du ikke få, da der er tale om et lukket system.

Ang. min tal-checker. Hvorfor virker den ikke?
Avatar billede jakoba Nybegynder
01. april 2002 - 01:06 #5
Ja det kan få siden til at fryse.
eksempel

for (i=1; i<5; i++) {
  for ( i=0; i<2; i++ ) {
      //her gør du noget
  }
  // her vil i ALTID have værdien 2
}

og når i altid har værdien 2 i slutningen af den ydre for-sætning vil testen i<5 altid være sand.
Den yder for-såtning kører uendeligt.

mvh JakobA
Avatar billede olebole Juniormester
01. april 2002 - 19:06 #6
learnie >> Man skal lede grundigt for at finde hullerne mellem fejlene i din tal-checker. Derfor ...  ;o)
/mvh
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