Button OnClick Wert übergeben
Gregor
- javascript
Hallo,
ich komme leider nicht weiter, ich habe eine IF-Schleife erstellt, das ein Datum abfragt und mit dem heutigen vergleicht.
Wenn das Datum nun abweicht von heute, soll ein Button erscheinen "Datum heute setzen" und das heutige Datum von der Variable setzen.
if ($('AUSGABEDATUM')) {
var today = new Date();
var month = today.getMonth()+1;
var year = today.getYear();
var day = today.getDate();
if(day<10) day = "0" + day;
if(month<10) month= "0" + month;
if(year<1000) year+=1900;
var datumheute = day + "." + month + "." + (year+"");
var ausgabedatum = $('AUSGABEDATUM').value;
if (ausgabedatum != datumheute) {
g_result +='Ausgabedatum:</font></b> Datum entspricht nicht dem heutigen Datum! <br><br><input type"button" value"Datum heute setzen" onClick=$('AUSGABEDATUM').value=datumheute>';
$('AUSGABEDATUM').style.background = "#FFFF99";
return false;
} else {
$('AUSGABEDATUM').style.background = "#FFFFFF";
return true;
}
}
Danke
Mahlzeit Gregor,
ich habe eine IF-Schleife erstellt,
Wow! Da wärst Du der erste, dem das geglückt ist ...
g\_result +='Ausgabedatum:</font></b> Datum entspricht nicht dem heutigen Datum! <br><br><input type"button" value"Datum heute setzen" onClick=$('AUSGABEDATUM').value=datumheute>';
Vermutlich hört der Browser (bzw. dessen Javascript-Engine) am ersten / auf, den Code zu interpretieren. Maskiere sämtliche in Strings vorkommenden / innerhalb des Javascript-Code-Blocks mittels \ ...
MfG,
EKKi
ich habe eine IF-Schleife erstellt,
Wobei if-Abfrage mindestens genauso hässlich klingt (wenngleich auch nicht falsch) - das geht schon fast als Pleonasmus durch.
Warum nicht einfach "Bedingte Verzweigung"?
er sagt mir einfach, dass die Variable "undefiniert" ist, wobei diese aber existiert und einen Wert hat!
Mahlzeit Gregor,
er sagt mir einfach, dass die Variable "undefiniert" ist, wobei diese aber existiert und einen Wert hat!
Welche Variable? Wie lautet die genaue Fehlermeldung? Welcher Browser?
MfG,
EKKi
Wert soll geholt werden von "datumheute" und den Wert per Button/onClick übergeben an:
$('AUSGABEDATUM').value
das Infofenster ist wohl ein DIV-Container, komme leider nicht an den Code, da es sich um einen im CAD-System integrierten Browser handelt!
if ($('AUSGABEDATUM')) {
var today = new Date();
var month = today.getMonth()+1;
var year = today.getYear();
var day = today.getDate();
if(day<10) day = "0" + day;
if(month<10) month= "0" + month;
if(year<1000) year+=1900;
var datumheute = day + "." + month + "." + (year+"");
var ausgabedatum = $('AUSGABEDATUM').value;
if (ausgabedatum != datumheute) {
g_result +='<input type"button" value"Datum heute setzen" onClick=$('AUSGABEDATUM').value=datumheute>';
$('AUSGABEDATUM').style.background = "#FFFF99";
return false;
} else {
$('AUSGABEDATUM').style.background = "#FFFFFF";
return true;
}
}
var year = today.getYear();
if(year<1000) year+=1900;
nutze stattdessen http://de.selfhtml.org/javascript/objekte/date.htm#get_full_year@title=getFullYear
g\_result +='Ausgabedatum:</font></b> Datum entspricht nicht dem heutigen Datum! <br><br><input type"button" value"Datum heute setzen" onClick=$('
ich hab mal da abgeschnitten, wo der String endet wegen '
übrigens fehlen im HTML ein paar =
Danke
Nächstes mal besser eine sinnvolle Fehlerbeschreibung!
der Wert "datumheute" ist vorhanden, aber sobald er in den "g_result +='" übergeben werden soll, hat er wohl keinen Bezug mehr "undefinied"
Mahlzeit Gregor,
der Wert "datumheute" ist vorhanden, aber sobald er in den "g_result +='" übergeben werden soll, hat er wohl keinen Bezug mehr "undefinied"
1.) Beachte gast42s Hinweis bzgl. der Anführungszeichen und Gleichheitszeichen.
2.) Schreibe XML-konformen HTML-Code (Element- und Attributbezeichner immer klein, Attributwerte immer in Anführungszeichen) ... dann fällt es nicht nur dem Browser leichter, Deinen Code zu verstehen - sondern auch Dir, Deine Fehler zu finden.
MfG,
EKKi
2.) Schreibe XML-konformen HTML-Code (Element- und Attributbezeichner immer klein, Attributwerte immer in Anführungszeichen) ... dann fällt es nicht nur dem Browser leichter, Deinen Code zu verstehen - sondern auch Dir, Deine Fehler zu finden.
Das Grundproblem ist hier doch, dass HTML-Code in JavaScript eingebettet wird. Dass in diesen HTML-Code wieder JavaScript-Code eingebettet wird, welcher auf Werte des JavaScript-Codes zugreifen soll, der ihn erzeugt hat.
Ob man da korrekten Code mit XML-Syntax schreibt oder nicht, es bleibt eine stetige Quelle der Probleme. Wenn man das sinnvoll lösen will, so wäre das eine Option: HTML-Code möglichst aus dem JS-Code in Templates auslagern (jquery-tmpl, Mustache, Handlebars o.ä.) und sämtliches Event-Handling mit effizientem JavaScript lösen. Dabei helfen auch MVC-Bibliotheken wie Spine und Backbone.
Mathias
Ob man da korrekten Code mit XML-Syntax schreibt oder nicht, es bleibt eine stetige Quelle der Probleme. Wenn man das sinnvoll lösen will, so wäre das eine Option: ...
das erscheint mir ein bisschen mit Kanonen auf Spatzen geschossen. Einen input-Button erzeugen (oder ein anderes geeigneteres Element im DOM) und dessem onclick-Event eine Funktion zuzuweisen ist simples JavaScript, dafür sind Bibliotheken ziemlich überflüssig
das erscheint mir ein bisschen mit Kanonen auf Spatzen geschossen. Einen input-Button erzeugen (oder ein anderes geeigneteres Element im DOM) und dessem onclick-Event eine Funktion zuzuweisen ist simples JavaScript, dafür sind Bibliotheken ziemlich überflüssig
Offenbar ist Gregors Code Teil einer größeren Formularvalidierung, wo ein längerer HTML-String erzeugt wird, der dann ausgegeben wird. Natürlich kann man das alles mit fünfhundert Zeilen Low-Level createElement, createTextNode, appendChild sowie addEvent/addEventListener usw. lösen. Der entstehende Code wäre nicht schöner als der Escaping-Wahnsinn beim Erzeugen von HTML-Strings mit JavaScript-Code drin, sondern genauso schlecht wartbar.
Die eine oder andere Abstraktion braucht man also auf jeden Fall. Eine gängige Bibliothek zu verwenden, die einem DOM-Operationen und Event-Handling, ist da auf keinen Fall überflüssig, sondern würde sowohl die Programmierung vereinfachen als auch den Code lesbarer und wartbarer machen.
Ob man anschließend auch Model- und View- bzw. Template-Logik trennt, was bei Formularvalidierung m.E. sicher sinnvoll ist, kann man überlegen. Bibliotheken braucht man dafür nicht unbedingt, das ist ja erst einmal ein Pattern, eine Konvention.
Mathias
mit fünfhundert Zeilen ...
Die eine oder andere Abstraktion braucht man also auf jeden Fall. Eine gängige Bibliothek zu verwenden, die einem DOM-Operationen und Event-Handling ...
Du übertreibst! Eine Funktion, die einfach ein Element (ggf. mit eingehängtem Textnode) erzeugt und ins DOM hängt braucht nun wirklich keine 500 Zeilen!
mit fünfhundert Zeilen ...
Die eine oder andere Abstraktion braucht man also auf jeden Fall. Eine gängige Bibliothek zu verwenden, die einem DOM-Operationen und Event-Handling ...
Du übertreibst! Eine Funktion, die einfach ein Element (ggf. mit eingehängtem Textnode) erzeugt und ins DOM hängt braucht nun wirklich keine 500 Zeilen!
Das habe ich nicht behauptet. Bitte zitiere nicht sinnentstellend.
Mathias
Das Grundproblem ist hier doch, dass HTML-Code in JavaScript eingebettet wird. Dass in diesen HTML-Code wieder JavaScript-Code eingebettet wird, welcher auf Werte des JavaScript-Codes zugreifen soll, der ihn erzeugt hat.
ganz genau, das ist mein Problem warum wohl auch die Variablen-Werte verloren gehen bzw. halt eben nicht angezogen werden können.
Mir würde es genügen zu wissen, wie ich denn meine Button-Funktion erstellen kann, dass ich mit diesem das Datum von heute setzen kann (00.00.0000)!
if ($('AUSGABEDATUM')) {
var today = new Date();
var month = today.getMonth()+1;
var year = today.getYear();
var day = today.getDate();
if(day<10) day = "0" + day;
if(month<10) month= "0" + month;
if(year<1000) year+=1900;
var datumheute = day + "." + month + "." + (year+"");
var ausgabedatum = $('AUSGABEDATUM').value;
if (ausgabedatum != datumheute) {
g_result +='<input type"button" value"Datum heute setzen" onClick=$('AUSGABEDATUM').value=datumheute>';
$('AUSGABEDATUM').style.background = "#FFFF99";
return false;
} else {
$('AUSGABEDATUM').style.background = "#FFFFFF";
return true;
}
}
wie könnte ich also den eingebetteten Button dazu bekommen, mir das Datum von heute auszugeben onClick?
g_result +='<input type"button" value"Datum heute setzen" onClick=$('AUSGABEDATUM').value=datumheute>';
Mahlzeit Gregor,
wie könnte ich also den eingebetteten Button dazu bekommen, mir das Datum von heute auszugeben onClick?
Erst einmal solltest Du Dir vielleicht angewöhnen, die Dir gegebenen Hinweise ernstzunehmen und Ratschläge zu befolgen.
g_result +='<input type"button" value"Datum heute setzen" onClick=$('AUSGABEDATUM').value=datumheute>';
Der String, den Du dort an Deine Variable "g_result" anhängst, enthält *KEIN* gültiges HTML. Schau ihn Dir nochmal genauer an ...
MfG,
EKKi
Hallo,
if ($('AUSGABEDATUM')) {
Was macht die Funktion $? Ist das die von Prototype oder Mootools?
var datumheute = day + "." + month + "." + (year+"");
year wird automatisch in einen String umgewandelt, weil davor Strings stehen, der Zusatz +"" ist nicht nötig.
g\_result +='Ausgabedatum:</font></b> Datum entspricht nicht dem heutigen Datum! <br><br><input type"button" value"Datum heute setzen" onClick=$('AUSGABEDATUM').value=datumheute>';
Ich nehme mal an, du schreibst diesen Code per innerHTML ins DOM.
datumheute ist vermutlich eine lokale Funktionsvariable. Der onclick-Code wird allerdings im globalen Scope ausgeführt. Da gibt es die Variable nicht mehr.
Du könntest jetzt natürlich mit wildem Escaping und Einbettung des Datums in einen String herumfummeln:
g_result += '<input type="button" value="Datum heute setzen" onclick="$('AUSGABEDATUM').value = '' + datumheute + ''">';
So etwas ist aber nicht schön und keine gute Lösung. Besser wäre Event-Handling mit JavaScript. Also ein Button-Element erzeugen und dann daran einen Event-Handler registrieren - als Funktion, nicht als String. Dann kannst du allerdings nicht mehr mit bloßen HTML-Strings arbeiten. Wenn du ein Framework wie Prototype oder Mootools verwendest, geht das auch sehr einfach.
Mathias