På senare tid har jag utvecklat ett flertal sidor där jag skapar en sida med en mängd selectboxar. Eftersom det sker dynamiskt så ger jag varje selectbox ett namn med en siffra efter (räknare). Problemet är att skiten ska postas vidare och jag behöver validera att vissa selectboxar är ifyllda på rätt sätt... ifall de finns. Idag löser jag det hela genom att komma åt value för resp. selectbox genom Elements[RÄKNARE]. Problemet är att det givetvis finns en massa andra objekt på sidan som man måste ta hänsyn till; ett himla räknande för att nå rätt objekt. Detta måste bara gå att lösa på ett smidigare sätt!
Validera SELECT
18 svar · 835 visningar · startad av HammerBoy
Hur ser valideringen ut? Jag skulle ge mig på någonting i stil med
var selects = ["select1", "select3", "select7"];
function validateSelects(f)
{
for (var i = 0; i < selects.length; ++i){
if (f.elements[selects[i]].selectedIndex == 0)
...
}
return true;
}
...
<form onsubmit="return validateSelects(this.form)">
Om valideringen ser likadan ut för varje <select> verkar ovanstående rimligt. Är den annorlunda får vi tala om det på något sätt.
var els = document.getElementsByTagName("SELECT");
nitro2k01 skrev:
var els = document.getElementsByTagName("SELECT");
Mjo... problemet är som sagt att jag har flera selectboxar.
SELECT1
SELECT2
SELECT3
...
...
Hur får jag in räknaren i det hela?
els = document.getElementsByTagName("SELECT"+i); ?
Det är denna detalj jag inte får ihop...
Det får du inte. Med nitros kod hämtar du samtliga element. Sedan får du loopa igenom samlingen efter de du vill ha.
Peter S skrev:
Hur ser valideringen ut? Jag skulle ge mig på någonting i stil med
var selects = ["select1", "select3", "select7"]; function validateSelects(f) { for (var i = 0; i < selects.length; ++i){ if (f.elements[selects[i]].selectedIndex == 0) ... } return true; } ... <form onsubmit="return validateSelects(this.form)">Om valideringen ser likadan ut för varje <select> verkar ovanstående rimligt. Är den annorlunda får vi tala om det på något sätt.
Tanken med att lägga in alla namn på alla selectboxarna i en array är väl god men fortfarande... hur får jag in de korrekta namnen om det finns en unik siffra i slutet av resp. namn enligt samma princip som du själv anger? Jag kan ju inte hårdkoda in arrayen för det är ju olika antal selectboxar vid olika tillfällen...
Peter S skrev:
Det får du inte. Med nitros kod hämtar du samtliga element. Sedan får du loopa igenom samlingen efter de du vill ha.
Aha... alla SELECT-objekt på sidan läggs in i arrayen els? Detta måste jag testa! :)
HammerBoy skrev:
Aha... alla SELECT-objekt på sidan läggs in i arrayen els? Detta måste jag testa!
Japp!
HammerBoy skrev:
Tanken med att lägga in alla namn på alla selectboxarna i en array är väl god men fortfarande... hur får jag in de korrekta namnen om det finns en unik siffra i slutet av resp. namn enligt samma princip som du själv anger? Jag kan ju inte hårdkoda in arrayen för det är ju olika antal selectboxar vid olika tillfällen...
Du behöver inte hårdkoda in dem. Vid något tillfälle vet du ju vilka som skall valideras och då definierar du arrayen. Så frågan blir: när och hur vet du vilka <select>s som skall valideras?
Peter S skrev:
Japp!
Du behöver inte hårdkoda in dem. Vid något tillfälle vet du ju vilka som skall valideras och då definierar du arrayen. Så frågan blir: när och hur vet du vilka <select>s som skall valideras?
Det jag vet är att alla selectboxar med samma namn måste valideras. T.ex. "sel_FTG1". Sen kan det som sagt även finnas "sel_FTG2" osv. Innan jag börjar min validering vet jag hur många selectboxar jag har att jobba med då jag ser till att spara värdet när jag loopar ut dom så den detaljen är oki doki...
Som sagt...
Jag kände inte till getElementsByTagName så jag måste labba lite men det känns som att det borde do the thing :)
Ett litet exempel på hur du skulle kunna göra:
var elms = document.getElementsByTagName("SELECT"),
len = elms.length;
while (len--){
if (/^sel_FTG\d+$/.test(elms.item(len).name)){
// handle elms.item(len)
}
}
Peter S skrev:
Ett litet exempel på hur du skulle kunna göra:
var elms = document.getElementsByTagName("SELECT"), len = elms.length; while (len--){ if (/^sel_FTG\d+$/.test(elms.item(len).name)){ // handle elms.item(len) } }
Jag har försökt med detta:
var els1 = document.getElementsByTagName("CHECKBOX");
var els2 = document.getElementsByTagName("SELECT");
var rc = document.theform.RecordCount.value;
for(i=0;i<rc;i++){
if(els1[i].checked && els2[i].options[els2[i].selectedIndex].value == ""){
alert("Felmeddelande");
return false;
}
}
I just det här exemplet så kommer alla selectboxar i par med en checkbox. Om checkboxen är i klickad måste man ha valt något i selectboxen. Nu smäller det i if-satsen; els1*.checked. Jag förstår inte riktigt varför...*
document.getElementsByTagName() vill ha HTML-element som argument, så "CHECKBOX" är ej att föredra. Vill du hämta alla sådana får du ange "INPUT" och sedan loopa igenom resultatet efter checkboxarna.
Peter S skrev:
document.getElementsByTagName() vill ha HTML-element som argument, så "CHECKBOX" är ej att föredra. Vill du hämta alla sådana får du ange "INPUT" och sedan loopa igenom resultatet efter checkboxarna.
Jaha... ok... tack. Det borde jag ha insett. Börjar bli seg en trappa upp. får gå hem och sova på saken och försöka imorgon igen.
Detta bör fixas före förmiddagsfikat :)
EDIT: Stort tack för all hjälp! Eftersom jag löst ursprungsfrågan valde jag att markera tråden som löst.
:bire
Jag skickar med ännu ett exempel:
<script type="text/javascript">
function f()
{
var s = document.getElementsByTagName("SELECT"),
i = (function(){
var a = [], i = document.getElementsByTagName("INPUT"), u = i.length;
while (u--)
if (i[u].type == "checkbox")
a.push(i[u]);
return a; })(),
r = s.length;
for (var n = 0; n < r; ++n){
if (i[n].checked && s[n].options[s[n].selectedIndex].value == ""){
alert("...");
return false;
}
}
return true;
}
</script>
<form onsubmit="return f()">
<input type="checkbox"><select><option value=""><option value="1"></select>
<input type="submit">
</form>
Godmorgon :)
Ditt skript ovan var riktigt trevligt men den bygger ju på antagandena att det dels finns lika många checkboxar som selects, att de kommer i par samt att alla ska kollas. Just den här gången så stämmer just detta och det du skickade med löser skäggbiffen... men det jag egentligen var ute efter var en direktaccess till respektive objekt för det skulle kunna ha varit så att det funnits flera checkboxar och/eller flera selects som inte skulle kollas.
Förstår jag dig rätt från ett tidigare svar att jag inte kan få denna direktaccess via t.ex. document.formen.namnet_på_objektet_3.value där siffran 3 bara är en i raden av liknande objekt?
Omformulering...
Säg att jag (dynamiskt) petar ut textboxarna:
text_0, text_1, text_2 och text_3. Detta är resp. objektnamn. Jag kan inte på förhand veta hur många textboxar som kommer att skrivas ut på sidan men jag vet naturligtvis hur många det är efter att de skrivits ut. Jag önskar alltså att dynamiskt loopa igenom alla textboxar med namnet "text_" och så en siffra. Finns det något sätt som man kan uppnå detta?
(Lång fråga och jag gissar att ditt svar blir "nej" ;) )
Upptäckte en liten sak med skriptet du skickade med. Eftersom du går igenom arrayen med alla inputs bakifrån s.a.s. så lägger du in alla checkboxar i omvänd ordning i arrayen i vilket gör att parförhållandet mellan checkboxar och selects inte stämmer. Enkelt fixat iofs... :)
Peter S skrev:
Anledningen till att exemplet ovan ser ut som det gör, är att du nämnde att checkboxarna och <select>-elementen kommer i par. Men det är som sagt lätt fixat.
Kika på inlägg #10 – det är nog någonting sådant du är ute efter.
I exemplet i #10 så loopar du ju igenom arrayen med alla select-objekt och testar vart och ett om namnet är enligt ett visst mönster. Det hacket kan man ju enkelt applicera på andra objekt om så skulle vara. Passar perfekt!
Me bad! Jag tittade inte tillräckligt noga på ditt exempel och när jag nu kikade på det såg jag ju det tjusiga med det på 2 röda. Jag får skylla på.... på... öhh... fullständig sinnesförvirring (dvs det gamla vanliga) :)
Tack och bock!
Hoppas du löser det! Annars är det bara att återkomma :bire