27. september 2023 - 20:04Der er
34 kommentarer og 1 løsning
Javescript der tjekker tjekbbokse
Jeg har tre afkrydsningsfelter (checkbox) ved navn valg[] i en formular og jeg vil kontrollere. om de bliver udfyldt. Min kode ser sådan ud:
if (checkbox.valg.value==="") { alert("Husk også checkboxene."); checkbox.valg.focus(); return false; } Men det virker åbenbart ikke. Hvad er der forkert?
sådan en name="..." er beregnet til at aflæse på serveren. I javascript er det meningen at din checkboxe skal have forskelligt id, og så kan du finde dem med document.getElementById.
Du kunne måske nok også "snyde" og bruge:
let checkboxe = document.getElementsByName("valg[]");
og løbe listen igennem igennem og så om der er krydset af.
Det er rigtigt, at jeg mest bruger PHP. Denne kode i PHP-en:
$avalg = (isset($_POST['valg']) ? $_POST['valg'] : ""); if(empty($avalg)){ die ("Tryk tilbage og marker et af felterne medlem/ikke medlem."); } $N = count($avalg); echo " ";
foreach($avalg as $valg) { $string_valg.= $valg." "; echo " "; } og så en .$string_valg. i svaret. Det giver en respons, hvis man ikke vælger et af felterne, men det er først når man har trykket på "submit". Javaschript på felterne gør, at man bliver på samme side, indtil formularen er korrekt udfyldt. Med PHP-kode på alle felter, bliver det besværligt for brugeren.
Ja, det er klart mere elegant at gøre det med javascript, men man er jo nødt til at gøre det i overensstemmelse med, hvordan javascript læser koden.
Fungerer dette bedre:
let found = true; var checkboxes = document.getElementsByName("valg[]"); for (i = 0; i < checkboxes.length; i++) { if (!checkboxes[i].checked) { alert("Husk også checkboxene."); found = false; } } return found;
Nu har jeg lige prøvet det af. Det virker desværre ikke, men efter "submit" virker PHP-koden stadigvæk, så brugeren må trykke tilbage, hvorefter email og telefonnummer også skal genskrives.
"Virker ikke" er ikke til synderlig meget hjælp. Hvad sker der? Hvad skulle ske? Hvilken kode udføres - præcist hvilken kode?
Men koden fra eyvindh er vist heller ikke helt smart. Hvis første checkbox ikke er krydset af, vil beskeden komme. Men er det ikke en kontrol af at mindst en af checkboxene er krydset af?
Helt utestet:
let found = false; var checkboxes = document.getElementsByName("valg[]"); for (i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) { found=true; } } if (!found) { alert("Husk også checkboxene."); } } return found;
let found = false; var checkboxes = document.getElementsByName("valg[]"); for (i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) { found=true; } } if (!found) { alert("Husk også checkboxene."); } return found;
Det er jo en lille smule nørdet. da PHPen jo udfører arbejdet, men det smarte skulle være at blive på samme side, indtil formularen er korrekt udfyldt. Der får man en alert, hvis de andre felter ikke er udfyldt. Angående "Virker ikke ". Der sker ingenting-ingen alerter eller fejlmeddelelser. jeg prøver den reviderede udgave af.
"Men er det ikke en kontrol af at mindst en af checkboxene er krydset af?" JO, netop. Har nu testet de nævnte eksempler. Der sker ikke andet andet end at PHP koden beder om at trykke tilbage og udfylde det manglende. Der er ingen fejlmeddelelser.
Har du prøvet at kigge i konsollen (klik F12 for at åbne den) efter fejlmeddelelser? Hvis ikke der står noget i den, så tror jeg det bliver nødvendigt at se html-koden for siden for at se om du har fået javascript-koden sat rigtigt ind.
Jeg har delt de to javaschipts i to, da jeg ikke synes, de hører under samme kategori. De er placeret i Head - delen af HTML-en (nederst lige før -body)
<script type="text/javascript"> let found = false; var checkboxes = document.getElementsByName("valg[]"); for (i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) { found=true; } } if (!found) { alert("Husk også checkboxene."); } } return found; </script>
<script type="text/javascript"> // alle af typen validate virker fint function validate(frm) { if (frm.navn.value==="") { alert("Alle felter med * skal udfyldes."); frm.navn.focus(); return false; } if (frm.adresse.value==="") { alert("Vi vil også gerne kende din adresse."); frm.adresse.focus(); return false; } osv osv return true; }
Så ser koden sådan ud: <script type="text/javascript"> function validate(frm) { let found = false; var checkboxes = document.getElementsByName("valg[]"); for (i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) { found=true; } } if (!found) { alert("Husk også checkboxene."); } } return found;
if (frm.navn.value==="") { alert("Alle felter med * skal udfyldes."); frm.navn.focus(); return false; } if (frm.adresse.value==="") { alert("Vi vil også gerne kende din adresse."); frm.adresse.focus(); return false; } if (frm.postnummer.value==="") { alert("Husk postnummer (4 cifre)."); frm.postnummer.focus(); return false; } // osv osv return true; } </script> Men den virker stadigvæk ikke. Ingen fejlmeddelelser.
Ja, der er fejl i konsollen, så lad være med at sige at der ikke er fejl.
Hvis du lægger mærke til forskellen mellem indlæg #7 og #8 så er der en ændring.
Men når din kode med den her angivne skal du lige tænke dig lidt om: Vi har sagt return, fordi vi ikke ved om du sætter koden først eller sidst. Hvis du kommer til den return i linje 13, så stopper efterfølgende kontrol.
Som du har at det op vil det være smart kun at sige return false, hvis der er fejl, og ellers fortsætte med resten af din kode.
Yderligere har du netop ikke et felt med navn "navn". Det hedder jo "navn[]".
I konsollen nævnes ukorrekt brug af navn på et formelement. Det må være navn[]..gætter jeg på. Så hvis javascript skal bruges her, må afkrydsningsfelterne have individuelle navne, og det så må programmeres således at et felt skal være afkrydset
Nu har jeg lavet felterne om til en selectbox med 3 muligheder:
Medlem af foreningerne <select name= "forening" multiple="false" > <option selected> </option> <option name="medlem[]"> Medlem_Skolebibliotekarer</option> <option name="medlem[]"> Medlem_IT-vejlederforeningen</option> <option name="medlem[]"> Medlem_Nej</option> </select> og Javascriptet: <script type="text/javascript">
function afsendelse(form) {
foreningValg = form.forening.selectedIndex if(form.forening.options[foreningValg].value==""){ alert("vælg en forening") return false } return true } Men der er stadigvæk fejl. Konsollen siger der er brugt deprecated kode. Måske er der select boxen, der ikke bruges mere?
Nu er selecten lavet om: <label for="forening-select">Vælg medlemsskab i boksen:</label> <select name="forening" id="forening-select" multiple="false">
Nu virker selve formularfilen, men PHP-response.filen kan stadigvæk ikke læses. Måske er det selve PHP-kodningen, der ikke lever op til PHP 8.2. Desværre kunne jeg heller ikke kontrollere JavaScriptet på selectboxen, selvom det nu er lige efter bogen. Jeg starter en ny tråd i PHP-afdelingen.
Min oprindelige ide med checkbokse har jeg nu konverteret til radiobuttons. Når man grupperer dem med samme navn, nærmer man sig det, jeg oprindelig havde tænkt. Her er min oprindelige php-kode stadig virksom ved tryk på submit, men ideen var at blive på samme side til alt er udfyldt. På nettet er der mange forslag til Javascript på radiobuttons, jeg leder stadig efter et forslag, der tjekker om én af knapperne er aktiveret.
Har nu afprøvet flere forslag, men ingen af dem forhidrer at submit går i aktion, selvom ingen af radiobuttons er valgt. Der burde være en mulig kode, der forhindrer man forlader formularen, før en af knapperne er markeret.
Jeg skal gerne indrømme, at jeg har ikke helt overblik over problematikken længere. Men hvis du er gået over til at bruge radiobuttons, var det måske en mulighed bare at indføje "required"-parameteren. Som fx her:
Nu har jeg afprøvet flere Javascript -koder både på checkboxe og selectbox, og så er løsningen bare radiobuttons og at skrive ="required" Radio er perfekte og virker efter min hensigt at blive i formularen til den er korrekt udfyldt. Resten af felterne er jo i forvejen tjekket af JavaScript med focus, hvis de ikke udfyldes. Resultatet af radioknapperne samles op af PHP-koden og skrives med i den afsendte mail til brugeren og til firmaet. Tak for ideen
Løsningen er ofte simpel når man først har fundet den ;-)
Godt at du fandt den. Jeg er nu ret sikker på at erikjacobsens kode ovenfor også kunne have løst opgaven. Men så vidt jeg kan se, havde du fået lukket validate funktionen forkert (der er en "tuborg-luk"-parentes for mange), da du satte den ind på din side. Og derfor virkede koden ikke ordentligt :)
Der er ikke megen forskel på brugen af checkboxe og brugen af radiobuttons. Der er dog den forskel, at radio har indbygget, at man kun kan vælge én ad gangen. Måske kunne man også bruge requiret på checkboxe? Selve php-koden er jo den samme. Lige nu har jeg eksperimenteret med CSS på required, hvor man kan få de obligatoriske felter fremhævet på forskellig vis. Måske skulle jeg også skifte mit billede, som er en sommerfugl af mølgruppen ved navn Neopalpa donaldtrumpii. Men det er jo en anden historie;-)
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.