Kleinster Value von select (multiple) finden
hawkmaster
- javascript
0 Gunnar Bittersmann0 hawkmaster0 dedlfix0 hawkmaster0 dedlfix
0 dedlfix1 Der Martin
Hallo zusammen,
in einer Auswahlliste (select multiple) sind mehrere Werte markiert.
Ich möchte jetzt gerne bei einem Click herausfinden welches der kleinste markierte Value ist
Ich habe es vermutlich sehr umständlich so versucht:
Alle Einträge die markiert sind im Select (selelm) schreibe ich in ein Array.
Jetzt habe ich versucht mit der Math.min Funktion den kleinsten Wert zu finden.
Aber der alert bringt immer NaN;
var spvalues_arr = new Array();
if(spdefault1 == false){
for(i=0;i<selelm.length;i++){
if(selelm.options[i].selected==true ){
spvalues_arr[i] = selelm.options[i].value;
}
}
}
var mini = spvalues_arr;
for(i=0;i<selelm.length;i++){
mini = Math.min(selelm.options[i].value,mini);
}
alert(mini);
was mache ich falsch, bzw. gibt es vielleicht eine elegantere Lösung?
vielen Dank und viele Grüße
hawk
@@hawkmaster:
nuqneH
was mache ich falsch
Lass dir mal 'typeof selelm.options[i].value' ausgeben.
Qapla'
Hallo Gunnar, Hallo dedlfic,
danke für eure Hinweise.
Ich vermute ihr meint das die Values im Select ja strings sind.
Also habe ich nun versucht die Values sowohl beim schreiben in das Select als auch nachher mit "parseInt()" umzuwandeln.
var spvalues_arr = new Array();
if(spdefault1 == false){
for(i=0;i<selelm.length;i++){
if(selelm.options[i].selected==true ){
spvalues_arr[i] = parseInt(selelm.options[i].value);
}
}
}
var mini = spvalues_arr;
for(i=0;i<selelm.length;i++){
//alert(typeof selelm.options[i].value);
mini = Math.min(parseInt(selelm.options[i].value),mini);
}
alert(mini);
leider kommt weiterhin die Ausgabe NaN
vielen Dank und viele Grüße
hawk
echo $begrüßung;
Ich vermute ihr meint das die Values im Select ja strings sind.
[...] parseInt() [...]
leider kommt weiterhin die Ausgabe NaN
Vermute bitte nicht nur, überprüf deine Vermutung auch - mit Kontrollausgaben. Was konkret für ein Wert wird beanstandet?
echo "$verabschiedung $name";
Hallo dedlfix,
Vermute bitte nicht nur, überprüf deine Vermutung auch - mit Kontrollausgaben. Was konkret für ein Wert wird beanstandet?
na ich habe doch natürlich sofort auch überprüft :-)
alert(typeof selelm.options[i].value);
bringt mir in den For Schleifen immer "string". Daher dachte ich das man den Value mit "parseInt" umwandeln muss
vielen Dank und viele Grüße
hawk
echo $begrüßung;
alert(typeof selelm.options[i].value);
bringt mir in den For Schleifen immer "string". Daher dachte ich das man den Value mit "parseInt" umwandeln muss
Ok, soweit so gut. Wenn nun beim parseInt() ein NaN entsteht (direkt danach geprüft?), muss der Wert vorher nicht als Zahl interpretierbar sein. Ich weiß nicht, inwieweit parseInt auf Leerzeichen allergisch reagiert, aber Kommas wären ein Kandidat fürs Misslingen.
echo "$verabschiedung $name";
echo $begrüßung;
Alle Einträge die markiert sind im Select (selelm) schreibe ich in ein Array.
Jetzt habe ich versucht mit der Math.min Funktion den kleinsten Wert zu finden.
Aber der alert bringt immer NaN;
Lass dir den Typ der Elemente anzeigen, was mit dem typeof-Operator geht. Dann sollte dir auffallen, dass auch Select-Werte - wie sämtliche Formularwerte - [*]... sind, die erst noch umgewandelt (geparst) werden müssen.
[*] Hier bitte Lösungswort einsetzen.
echo "$verabschiedung $name";
Hallo,
in einer Auswahlliste (select multiple) sind mehrere Werte markiert.
Ich möchte jetzt gerne bei einem Click herausfinden welches der kleinste markierte Value ist
du meinst, zahlenmäßig der kleinste? - Das ergibt sich aus deinem Codeauszug, ist aber nicht selbstverständlich, weil die values ja nicht unbedingt Zahlenwerte sein müssen.
Ich habe es vermutlich sehr umständlich so versucht:
Allerdings. ;-)
var spvalues_arr = new Array();
if(spdefault1 == false){
for(i=0;i<selelm.length;i++){
Ich nehme an, selelm ist eine Referenz auf das select-Element? Dann überlege mal, ob das select-Elementobjekt selbst überhaupt eine length-Eigenschaft hat. Du meintest die Anzahl der options?
Ergo: Die for-Schleife wird überhaupt nicht bearbeitet!
if(selelm.options[i].selected==true ){
Warum nochmal explizit auf true vergleichen? if (selelm.options[i].selected) ist einfacher und verständlicher.
spvalues\_arr[i] = selelm.options[i].value; } }
}
var mini = spvalues_arr;
Damit weist du mini ein Array zu. Ist das deine Absicht?
for(i=0;i<selelm.length;i++){
mini = Math.min(selelm.options[i].value,mini);
}
Und dann versuchst du mit Math.min quasi ein Array mit einem Zahlenwert zu vergleichen. Der indirekte Hinweis auf parseInt() war zwar von der Didaktik her gut, aber nicht notwendig. Javascript konvertiert Strings automatisch in Zahlenwerte, wenn der Kontext zwingend einen Zahlenwert verlangt.
Dein Problem ist aber, dass das Array mini im ersten Schleifendurchlauf nicht in einen Zahlenwert konvertiert werden kann, Math.min() deshalb NaN zurückgibt. In allen weiteren Schleifendurchläufen ist eines der beiden Argumente von Math.min() wieder NaN, das Ergebnis mithin wiederum NaN.
was mache ich falsch, bzw. gibt es vielleicht eine elegantere Lösung?
Die option-Werte gibst du doch vor. Also weißt du auch mit Sicherheit, welcher Wert auf keinen Fall übeschritten werden kann. Initialisiere deshalb den min-Wert mit einem sehr großen Wert, der in deinen Daten nicht vorkommt.
Dann läufst du *nur einmal* durch die option-Elemente und vergleichst in jedem Durchlauf das bisher ermittelte Minimum mit dem aktuellen Eintrag (Math.min ist da sicher kein falscher Ansatz), sofern er selektiert ist.
Ist am Schleifenende der min-Wert immer noch größer als der größte erlaubte Wert, waren keine Einträge selektiert - hast du den Fall eigentlich bisher berücksichtigt?
So long,
Martin
Hallo Martin,
herzlichen Dank für deine ausführliche Hilfe und Erklärung.
Ergo: Die for-Schleife wird überhaupt nicht bearbeitet!
doch, die schleife wird schon durchlaufen. Auch die Prüfung ob ein Wert selektiert wurde klappt.
Damit weist du mini ein Array zu. Ist das deine Absicht?
ja das war es :-)
Also das Ganze sieht ungefähr so aus.
Es gibt zwei Selects auf dem Form, wobei hier nur "sel_serviceproperties" eine Rolle spielt. In diesem Select werden die Options dynamisch erstellt durch eine Auswahld es ersten Selects.
Ein Anwender soll jetzt die Möglichkeit haben, einen dieser Werte als "Standard" Wert festzulegen. Ich habe es so versucht, dass ich neben dem Select für jeden Eintrag ein Radio Button aufbaue der genau den gleichen Value hat.
<select name="sel_serviceproperties[]" size="10" multiple="multiple" onclick="check_sp_default_value(this,this.form.radio_serviceproperty_default);" >
<option value="4">Source1</option>
<option value="5">Source2</option>
</select>
<input type="radio" name="radio_serviceproperty_default" value="4" />
<input type="radio" name="radio_serviceproperty_default" value="5" />
Meine Überlegung war nun: Angenommen als Default Wert "radio_serviceproperty_default" was 5 festgelegt. Der Anwender möchte im "sel_serviceproperties" diesen Wert aber garnicht mehr. Dann soll automatisch der nächst kleinere Value als Default markiert werden.
Daher mein vielleicht umständlicher Versuch :-)
vielen Dank und viele Grüße
hawk