Bei Funktionsaufruf Variable auf Wert setzen
Dynamite1953
- javascript
0 JürgenB
0 dedlfix
1 Gunnar Bittersmann
0 ChrisB
Hallo zusammen,
ich habe ein Problem mit Javascript und bin nach etlichem hin und her am verzweifeln. Es ist wohl nur ein Denkfehler meinerseits. Hier kurz mein Problem:
Ich rufe in einem Formular mit onsubmit eine Funktion auf, die bei bestimmten, nicht erfüllten Bedingungen eine Variable mit "false" zurück gibt. Außerhalb der Funktion habe ich diese Variable auf "true" gesetzt. Sprich, sind von vornherein alle Bedingungen erfüllt, wird auch true zurück gegeben.
Sollte aber eine Bedingung nicht erfüllt sein, wird die Variable auf "false" gesetzt und das Formular wird nicht abgesendet. Soweit alles gut. Sende ich nun das Formular aber erneut ab, ist diese Variable von vornherein auf "false" gesetzt. Da diese Variable aber nicht direkt in der Funktion deklariert wird, kann ich somit auch nicht der Funktion beim absenden einen neuen wert für die variable mitsenden oder?
Wie stelle ich es nun aber an, dass bei jedem absenden des Formulars die Variable erst einmal auf "true" gesetzt wird?
Hier das Script:
var check=true;
function validate(position,art){
if(art=='datum')
{
if(position.value.match(/^[0-3][0-9][\.][0-1][0-9][\.][2][0-9][0-9][0-9][ ][0-2][0-9][\:][0-5][0-9]$/))
{
position.style.border="";
}
else
{
position.style.border="1px solid #f00";
check=false;
}
}
}
function validateform(formular)
{
var datum1_spieltag=document.getElementById('dat1');
if(datum1_spieltag!==undefined){validate(datum1_spieltag,'datum');}
if(!check)
alert('Bitte erst alle rot gekennzeichneten Felder richtig ausfüllen!');
return check;
}
Schonmal vielen Dank für eure Hilfe.
Gruß Micha
Hallo Dynamite1953,
setz doch einfach um "guten" Zweig check auf true:
var check=true;
function validate(position,art){
if(art=='datum')
{
if(position.value.match(/[1][0-9][.][0-1][0-9][.][2][0-9][0-9][0-9][ ][0-2][0-9][:][0-5][0-9]$/))
{
position.style.border="";
check=true; // <-------------------------
} else { position.style.border="1px solid #f00"; check=false; }
}
}
Gruß, Jürgen
0-3 ↩︎
Ich kann in den "guten" Zweig leider kein check=true rein setzen, da er solange die Funktion durchläuft, bis alle Formularfelder bearbeitet wurden. Ist in meinem Script nicht erkennbar, da ich es gekürzt hatte, aber da gibt es noch ein paar mehr Felder:
function validateform(formular)
{
var datum1_spieltag=document.getElementById('dat1');
if(datum1_spieltag!==undefined){validate(datum1_spieltag,'datum');}
var datum2_spieltag=document.getElementById('dat2');
if(datum2_spieltag!==undefined){validate(datum2_spieltag,'datum');}
if(!check)
alert('Bitte erst alle rot gekennzeichneten Felder richtig ausfüllen!');
return check;
}
Und wenn nur ein Feld davon richtig ist, würde er check auf true setzen und somit das Formular absenden.
Dann lass die Funktion validate true oder false zurückgeben und sammel das Ergebnis da wo diese Funktion hintereinander aufgerufen wird.
var check = true;
var datum1_spieltag=document.getElementById('dat1');
if(datum1_spieltag!==undefined)
{
if (!validate(datum1_spieltag,'datum'))
check = false;
}
if(nächstes Feld ...)
Hi,
Ich kann in den "guten" Zweig leider kein check=true rein setzen, da er solange die Funktion durchläuft, bis alle Formularfelder bearbeitet wurden.
Und wenn nur ein Feld davon richtig ist, würde er check auf true setzen und somit das Formular absenden.
Dann dreh die Logik einfach um:
Das kann dann alles mit einer lokalen Variablen innerhalb der Funktion geschehen - die Variable außerhalb der Funktion zu deklarieren, ist gar nicht mehr nötig*. Es wird einfach der Rückgabewert der Funktion ausgewertet, und fertig.
* Deine Hilfsfunktion validate schreibst du dann natürlich auch so um, dass sie eine true/false-Rückgabe liefert, die an der aufrufenden Stelle entsprechend ausgewertet wird.
MfG ChrisB
Hi!
Ich rufe in einem Formular mit onsubmit eine Funktion auf, die bei bestimmten, nicht erfüllten Bedingungen eine Variable mit "false" zurück gibt.
Nein, das macht sie nicht. Funktionen geben keine Variablen zurück sondern Werte. In deinem Fall gibt sie gar nichts zurück. Sie setzt aber eine globale Variable auf den Wert false, oder sie rührt den vorhandenen Wert nicht an. Sowas ist schlechtes Design für eine Validierungsfunktion. Sie sollte besser, statt eine globale Variable zu verändern, einen boolschen Wert mit dem Testergebnis liefern.
Außerhalb der Funktion habe ich diese Variable auf "true" gesetzt. Sprich, sind von vornherein alle Bedingungen erfüllt, wird auch true zurück gegeben.
Auch falsch formuliert. Wie gesagt wird nichts zurückgegeben. Und wenn alle Bedingungen erfüllt sind, ist nicht true der Zustand der Variable, sondern es ändert sich am bisherigen Zustand nichts.
Wie stelle ich es nun aber an, dass bei jedem absenden des Formulars die Variable erst einmal auf "true" gesetzt wird?
Wenn ich dich richtig verstehe, ist dein eigentliches Ziel, die Formularversendung abhängig von der Validitätsprüfung zu machen und nicht von irgendeinem Zustand einer Variable. Diese sollte lediglich als Hilfsmittel dienen. Du kannst, wenn du die Validierfunktion auf die direkte Rückgabe des Prüfergebnisses umstellst, direkt in Abhängigkeit des Funktionsergebnisses den weiteren Ablauf steuern. Und der läuft dann immer wieder so ab, unabhängig von irgendeinem früheren Durchlauf.
Lo!
Hallo,
Funktionen geben keine Variablen zurück sondern Werte.
Hm nein, das stimmt so nicht, JavaScript gibt eine Referenz auf das Objekt zurück (was ja eher einer 'variable' entspricht die man verändern kann als einem Wert der unveränderlich ist), siehe:
function foo(a) {
a.c = 3
setTimeout(function() { console.log(a.c) }, 500)
return a
}
var a = {b:1,c:2}
var r = foo(a)
console.log(r.c)
r.c = 4
Jeena
Hi!
Funktionen geben keine Variablen zurück sondern Werte.
Hm nein, das stimmt so nicht, JavaScript gibt eine Referenz auf das Objekt zurück (was ja eher einer 'variable' entspricht die man verändern kann als einem Wert der unveränderlich ist), siehe:
Ein Objekt ist keine Variable, auch eine Referenz nicht. Wohl aber können Variablen Objekte und Referenzen enthalten oder andersrum formuliert Objekte und Referenzen darauf in Variablen abgelegt werden. Andererseits können Objekte und Referenzen völlig ohne Variablen leben.
function foo(a) {
a.c = 3
setTimeout(function() { console.log(a.c) }, 500)
return a
}
In a ist eine Referenz auf ein Objekt enthalten. Und es wird diese Referen auf das Objekt zurückgegeben. Die Variable a spielt außerhalb der Funktion keine Rolle.
var a = {b:1,c:2}
Das ist ein anderes a. als das in der Funktion.
var r = foo(a)
Dass du es hier eine Variable a mit einer Referenz auf ein Objekt drin der Funktion übergibst, die diese Referenz in einer lokalen Variablen namens a ablegt, liegt an deiner Benennung. Du könntest das globale a auch anders nennen.
console.log(r.c)
r.c = 4
Alle drei, das globale a, das lokale a und das globale r zeigen auf das selbe Objekt. Es wird lediglich eine Referenz auf das Objekt weitergereicht oder eine Kopie der Referenz erstellt, wenn diese in einer weiteren Variable abgelegt werden soll.
Lo!
@@Dynamite1953:
nuqneH
Du hast noch ganz andere Probleme:
if(position.value.match(/^[0-3][0-9][\.][0-1][0-9][\.][2][0-9][0-9][0-9][ ][0-2][0-9][\:][0-5][0-9]$/))
Der Ausdruck ist unbrauchbar. "32.06.2011 29:00" matcht, es wird weder das ungültige Datum noch die ungültige Uhrzeit erkannt.
BTW: . und : haben innerhalb von [ ] keine Sonderbedeutung, sie sind also nicht mit \ zu escapen.
BTW2: [x] ist wenig sinnvoll, dafür kannst du gleich x schreiben.
Aber das ganze Geraffel kannst du dir sparen, wenn du das mit HTML5 eingeführte Datum-und-Uhrzeit-Eingabefeld <input type="datetime"/>
verwendest. [HTML5]
position.style.border="";
position.style.border="1px solid #f00";
Sowas ist dann auch nicht nötig, CSS3 bietet die Pseudoklassen :valid
und :invalid
. [CSS3-UI]
Es ist zu überlegen, ob man für Browser, die das noch nicht unterstützen (leider gehört auch Firefox 5 dazu), überhaupt noch eine zusätzliche clientseitige Überprüfung implementieren möchte.
Serverseitig müssen die Daten ja sowieso nochmal geprüft werden.
Qapla'
Hi,
Es ist zu überlegen, ob man für Browser, die das noch nicht unterstützen (leider gehört auch Firefox 5 dazu), überhaupt noch eine zusätzliche clientseitige Überprüfung implementieren möchte.
Da Firefox ja jetzt auch dem Chrome-Versionsnummern-Wahn verfallen ist, kann man mit Version 17 ja spätestens Ende nächsten Monats rechnen ...
MfG ChrisB