Avatar billede bigo Nybegynder
19. november 2004 - 11:27 Der er 21 kommentarer og
1 løsning

Valider felter

Hejsa.

Jeg kunne godt tænke mig en funktion der sammenligner et vilkårligt antal inputfelter med en oprindelig værdi. Hvis der er ændringer i værdierne skal der fremkomme en ja/nej boks om at fortsætte.

--snip--
<input type=hidden name=ting1 value=<?=$Row["ting1"];?>>
<input type=hidden name=ting2 value=<?=$Row["ting2"];?>>
<input type=hidden name=ting3 value=<?=$Row["ting3"];?>>

<input type=text name=text1>
<input type=text name=text2>
<input type=text name=text3>

<input type=submit onclick="return Valider_Felter(ting1, ting2, ting3, text1, text2, text3);">

--snap--

agtigt..
Avatar billede ldanielsen Nybegynder
19. november 2004 - 11:45 #1
<input type=text name=text1 onChange="dataChanged = true;">

- men hvis du retter værdien, og så retter tilbage, så vil det stadig blive opfattet som om at der er rettet i værdierne.

<form onSubmit="return Valider_Felter(this);">


og:

function Valider_Felter(f){
  if (dataChanged) return (confirm("Data ændret, vil du fortsætte?"));
  return true;
  }
Avatar billede ldanielsen Nybegynder
19. november 2004 - 11:46 #2
din validering skal være på onSubmit på <form>, ikke på onClick på Submitknappen
Avatar billede schaefner Juniormester
19. november 2004 - 11:47 #3
<script type="text/javascript">
function compareFields(frm, fields1, fields2) {
    old_field = fields1.split(',');
    new_field = fields2.split(',');
    for (i=0;i<new_field.length;i++) {
        if (frm[old_field[i]].value != frm[new_field[i]].value) {
            return confirm("Nogle felter er blevet ændret - vil du fortsætte?");
        }
    }
}
</script>

<form action="" onsubmit="return compareFields(this, 'ting1,ting2,ting3', 'text1,text2,text3')">

<input type="hidden" name="ting1" value="1" />
<input type="hidden" name="ting2" value="2" />
<input type="hidden" name="ting3" value="3" />

<input type="text" name="text1" />
<input type="text" name="text2" />
<input type="text" name="text3" />

<input type="submit" value="Send" />

</form>
Avatar billede ldanielsen Nybegynder
19. november 2004 - 12:06 #4
Det var faktisk smart! men hvad med andre felter end tekstboxe/texareas?

Hvis det ikke er nødvendigt at tage hensyn til andre typer, så kan du sammenligne .value med .defaultValue for det felter der skal checkkes.
Avatar billede bigo Nybegynder
19. november 2004 - 12:49 #5
Det er textarea, text, radio og checkboxes jeg skal checke
Avatar billede ldanielsen Nybegynder
19. november 2004 - 13:01 #6
function Valider_Felter(f){
  if (f.text1.value != f.text1.defaultValue) dataChanged = true; 
  if (f.text2.value != f.text2.defaultValue) dataChanged = true; 
  if (f.text3.value != f.text3.defaultValue) dataChanged = true; 
  if (f.text4.value != f.text4.defaultValue) dataChanged = true; 
  if (dataChanged) return (confirm("Data ændret, vil du fortsætte?"));
  return true;
  }

og drop så det med onChange, ok?
Avatar billede bigo Nybegynder
19. november 2004 - 13:02 #7
schaefner> har prøvet dit script.. virker næsten. Her er kode:

onsubmit=\"return compareFields(this, 'q_1,q_2,q_3,q_4,q_5', 'q_type,question,options,comment_check,extraoption')

<input type=hidden name=q_1 value='{$_SESSION[s_q][$current_pointer][q_type]}'>
<input type=hidden name=q_2 value='{$_SESSION[s_q][$current_pointer][question]}'>
<input type=hidden name=q_3 value='{$_SESSION[s_q][$current_pointer][options]}'>
<input type=hidden name=q_4 value='{$_SESSION[s_q][$current_pointer][comment_check]}'>
<input type=hidden name=q_5 value='{$_SESSION[s_q][$current_pointer][extraoption]}'>

            <input type=radio name=q_type value='radiochoise' ".(($_SESSION[s_q][$current_pointer][q_type] == "radiochoise" || $_SESSION[s_q][$current_pointer][q_type] == "") ? "checked" : "")." onclick='this.form.extraoption.disabled=!this.checked;'><font size=1>(<a href='java script:openWin(\"Eksamples/radiochoise.php\");'>$strChoises[1]</a>)</font>
            <input type=radio name=q_type value='checkchoise' ".(($_SESSION[s_q][$current_pointer][q_type] == "checkchoise") ? "checked" : "")." onclick='this.form.extraoption.disabled=!this.checked;'><font size=1>(<a href='java script:openWin(\"Eksamples/checkchoise.php\");'>$strChoises[2]</a>)</font><br>
            <input type=radio name=q_type value='pulldownchoise' ".(($_SESSION[s_q][$current_pointer][q_type] == "pulldownchoise") ? "checked" : "")." onclick='if(this.checked) {this.form.extraoption.checked=false;this.form.extraoption.disabled=true;}'><font size=1>(<a href='java script:openWin(\"Eksamples/pulldownchoise.php\");'>$strChoises[3]</a>)</font>
            <input type=radio name=q_type value='textchoise' ".(($_SESSION[s_q][$current_pointer][q_type] == "textchoise") ? "checked" : "")." onclick='if(this.checked) {this.form.extraoption.checked=false;this.form.extraoption.disabled=true;}'><font size=1>(<a href='java script:openWin(\"Eksamples/textchoise.php\");'>$strChoises[4]</a>)</font><br>
            <input type=radio name=q_type value='numberchoise' ".(($_SESSION[s_q][$current_pointer][q_type] == "numberchoise") ? "checked" : "")." onclick='if(this.checked) {this.form.extraoption.checked=false;this.form.extraoption.disabled=true;}'><font size=1>(<a href='java script:openWin(\"Eksamples/numberchoise.php\");'>$strChoises[5]</a>)</font>
            <input type=radio name=q_type value='ratechoise' ".(($_SESSION[s_q][$current_pointer][q_type] == "ratechoise") ? "checked" : "")." onclick='if(this.checked) {this.form.extraoption.checked=false;this.form.extraoption.disabled=true;}'><font size=1>(<a href='java script:openWin(\"Eksamples/ratechoise.php\");'>$strChoises[6]</a>)</font><br>

            <textarea rows=10 cols=35 name=question onblur='if(this.value == \"\") {alert(\"$strAlert[2]\");this.select();this.focus();}'>".stripslashes($_SESSION[s_q][$current_pointer][question])."</textarea>
            <textarea rows=10 cols=35 name=options onblur='if(this.value == \"\") {alert(\"$strAlert[2]\");this.select();this.focus();}'>".stripslashes($_SESSION[s_q][$current_pointer][options])."</textarea>
            $strBodyText[8]: <input type=checkbox name=comment_check ".(($_SESSION[s_q][$current_pointer][comment_check] == "on") ? " checked " : "").">
            $strBodyText[9] : <input type=checkbox name=extraoption >

Uanset hvad, så kommer den frem og siger at der er ændret ting.
Avatar billede bigo Nybegynder
19. november 2004 - 13:14 #8
ah. q_1 = value q_type=undefined

Så den kan ikke se hvad q_type er.. hmm..
Avatar billede bigo Nybegynder
19. november 2004 - 13:15 #9
kan det være fordi q_type er <input type=radio ...> ??
Avatar billede bigo Nybegynder
19. november 2004 - 13:34 #10
q_type bliver sat til checked men q_1 bliver = "radiochoise"

Så den bliver sg nok lidt svær..
Avatar billede ldanielsen Nybegynder
19. november 2004 - 13:55 #11
Jeg synes jo selv at min version er let, og den kræver ikke at du tilføjer noget til felterne, blot at du indfører deres navne i array'et
Avatar billede bigo Nybegynder
19. november 2004 - 14:17 #12
Den er også let.

problemet er følgende:
når jeg kommer ind på siden kan f.eks. q_type være lig teksten "radiochoise" eller "checkchoise". Men når jeg klikker på den dersens radiobutton udfor feks. q_type=checkchoise så er værdien på q_type ikke "checkchoise" men om checked.
Så jeg kan ikke se jeg kan sammenligne de 2 værdier.

Det jeg evt. kunne checke på inden jeg sætter en hidden værdi var om den var lig med "sig selv" så kunne jeg sætte q_1 = checked. Men hvilken er det så jeg har checked. "radiochoise" eller en af de andre.. arg.. driving me nutta..
Avatar billede bigo Nybegynder
19. november 2004 - 14:32 #13
som jeg lige tænker... og det gør jeg jo.. så skulle man lave en funktion der kører onbodyload som - afhængig af input typen - sætter den aktuelle værdi i "old_value". Onsubmit skal samle de aktuelle status og sammenligne med "old_values".
Avatar billede bigo Nybegynder
19. november 2004 - 14:37 #14
eller også tænker jeg forkert..
Avatar billede ldanielsen Nybegynder
19. november 2004 - 15:13 #15
defaultSelected
defaultChecked

findes også

Så hvis man gør sådan

var arrFelter = new Array("felt1");
var arrRadioFelter = new Array("felt4");
var arrCheckboxFelter = new Array("felt5");
function Valider_Felter(f){
    dataChanged = false;
    for (i=0;i<arrFelter.length;i++){
        thisFelt = f[arrFelter];
        if (thisFelt.value != thisFelt.defaultValue) dataChanged = true;
        }
    for (i=0;i<arrCheckboxFelter.length;i++){
        thisFelt = f[arrCheckboxFelter];
        if (thisFelt.checked != thisFelt.defaultChecked) dataChanged = true;
        }
    for (i=0;i<arrRadioFelter.length;i++){
        thisFelt = f[arrRadioFelter];
        for (n=0;n<thisFelt.length;n++){
            if (thisFelt[n].checked != thisFelt[n].defaultChecked) dataChanged = true;
            }
        }
    alert(dataChanged)
    }

Du skal altså lave tre Arrays, et med radiofelter, et med checkboxes og et med textareas, text, og password

Nu tror jeg den er der.
Avatar billede bigo Nybegynder
20. november 2004 - 21:10 #16
Undskyld jeg er lidt sent ude.. men meget skal laves..

var arrFelter = osv.. dem skal jeg ikke have med.. de er som test eller...

hvordan skal jeg så kalde Valider_Felter når jeg f.eks. har feltnavnene som ovenstående (7 up ^)

Noget ala:

<form name=dims onsubmit="Valider_Felter(q_type, question, comment_check, extra_option);">

eller...
Avatar billede ldanielsen Nybegynder
22. november 2004 - 08:48 #17
nej

<form name=dims onsubmit="return Valider_Felter(this);">

- som jeg har lavet det

Og de tre arrays skal være der, i den udstrækning du skal have valideret alle tre felttyper. Du skal indskrive felternes name, med komma imellem. Kun felter der sår listet i et af disse tre arrays bliver valideret for "Data changed":

var arrFelter = new Array("felt1", "felt2");
var arrRadioFelter = new Array("felt4", "felt3");
var arrCheckboxFelter = new Array("felt5", "felt6", "felt7");
function Valider_Felter(f){
    dataChanged = false;
    for (i=0;i<arrFelter.length;i++){
        thisFelt = f[arrFelter];
        if (thisFelt.value != thisFelt.defaultValue) dataChanged = true;
        }
    for (i=0;i<arrCheckboxFelter.length;i++){
        thisFelt = f[arrCheckboxFelter];
        if (thisFelt.checked != thisFelt.defaultChecked) dataChanged = true;
        }
    for (i=0;i<arrRadioFelter.length;i++){
        thisFelt = f[arrRadioFelter];
        for (n=0;n<thisFelt.length;n++){
            if (thisFelt[n].checked != thisFelt[n].defaultChecked) dataChanged = true;
            }
        }
    if (dataChanged) return (confirm("Data ændret, ok?"));
    return true;
    //alert(dataChanged)
    }
Avatar billede bigo Nybegynder
22. november 2004 - 11:56 #18
ok.. Så man skal vide hvilken type felterne er på forhånd.. men det er osse ok..

Jeg prøver..
Avatar billede bigo Nybegynder
22. november 2004 - 12:28 #19
Det lader til at den kun kører det første array igennem..

var arrFelter = new Array("question");
var arrRadioFelter = new Array("q_type");
var arrCheckboxFelter = new Array("comment_check", "extraoption");
function Valider_Felter(f)
{
    dataChanged = false;
    for (i=0;i<arrFelter.length;i++)
    {
        thisFelt = f[arrFelter];
        if (thisFelt.value != thisFelt.defaultValue) dataChanged = true;
    }
    for (i=0;i<arrCheckboxFelter.length;i++)
    {
        thisFelt = f[arrCheckboxFelter];
        if (thisFelt.checked != thisFelt.defaultChecked) dataChanged = true;
    }
    for (i=0;i<arrRadioFelter.length;i++)
    {
        thisFelt = f[arrRadioFelter];
        for (n=0;n<thisFelt.length;n++)
        {
            if (thisFelt[n].checked != thisFelt[n].defaultChecked) dataChanged = true;
        }
    }
    if (dataChanged)
        return (confirm("Data ændret, ok?"));
    return true;
    //alert(dataChanged)
}
   

Hvis jeg smider en alert ("D:" + arrCheckboxFelter.length); ind så fortæller den mig at arrayet er 2 langt. Men der kommer ikke nogen "Data ændre, ok?" frem..
Avatar billede ldanielsen Nybegynder
22. november 2004 - 13:11 #20
Der manglede tre gange [i], jeg havde ikke testet det ordentligt, sorry


var arrFelter = new Array("question");
var arrRadioFelter = new Array("q_type");
var arrCheckboxFelter = new Array("comment_check", "extraoption");

function Valider_Felter(f)
{
    dataChanged = false;
    for (i=0;i<arrFelter.length;i++)
    {
        thisFelt = f[arrFelter[i]];
        if (thisFelt.value != thisFelt.defaultValue) dataChanged = true;
    }
   
    for (i=0;i<arrCheckboxFelter.length;i++)
    {
        thisFelt = f[arrCheckboxFelter[i]];
        if (thisFelt.checked != thisFelt.defaultChecked) dataChanged = true;
    }
    for (i=0;i<arrRadioFelter.length;i++)
    {
        thisFelt = f[arrRadioFelter[i]];
        for (n=0;n<thisFelt.length;n++)
        {
            if (thisFelt[n].checked != thisFelt[n].defaultChecked) dataChanged = true;
        }
    }
    if (dataChanged) return (confirm("Data ændret, ok?"));
    return true;
    //alert(dataChanged)
}
Avatar billede bigo Nybegynder
22. november 2004 - 13:34 #21
Kanon.. det virker for godt til at være sandt ;-)

Smid et svar ..
Avatar billede ldanielsen Nybegynder
22. november 2004 - 13:59 #22
Super. Du skal lige checkke med andre browsere, men javascriptet er indenfor normale standarder, så det skulle virke ...
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