2016-06-02 11 views
0

Ich habe zwei Formularfelder, die eine Datumausgabe aus einem früheren Skript speichern, jede Eingabe Jahrstart und YEAREND werden mit einem Datum im Format YYYY-MM-DD aufgefüllt. Das Skript wird durch eine verschachtelte onchange-Funktion ausgelöst, indem die zwei Felder durch Auswählen eines Jahres aus einem anderen Dropdown-Menü gefüllt werden und dann die verschachtelte Funktion ausgelöst wird, um das zweite Dropdown-Auswahlelement zu füllen.Iteration zwischen Daten in Javascript

<input type="text" name="yearstart" id="yearstart" value="" readonly/> 
<input type="text" name="yearend" id="yearend" value="" readonly/> 
<select id="weekselect"></select> 

<script> 
    function getWeeks() { 
     document.getElementById("weekselect").innerHTML = ""; 

     var yearstart = new Date(document.getElementById('yearstart').value); 
     var yearend = new Date(document.getElementById('yearend').value); 
     var iDate = new Date(yearstart); 

     while (iDate < yearend) { 
      var newele = document.createElement('option'); 
      newele.text = toJSONLocal(iDate); 
      document.getElementById('weekselect').appendChild(newele); 
      iDate.setDate(iDate.getDate() + 7) 
     } 
    } 
</script> 

es funktioniert, ist es aber leider nur funktioniert, wenn ich ein Jahr wählen, dessen Wert größer ist als die bereits ausgewählt, so 2015, 2016 dann funktioniert, aber ich dann 2 Jahre auch von Terminen wert nicht nur einen, also bin ich mir nicht sicher, was ich vermisse. Ich kann nur vermuten, dass das Skript ausgelöst wird, bevor die Werte aktualisiert werden, aber die Reihenfolge, in der die verschachtelten Skripts ausgeführt werden, sollte dies verhindern.

Irgendwelche Ideen Leute?

+1

Ein Kommentar, ich glaube nicht, 'new Date (...)' wird richtig 'YYYY-MM-DD' analysieren. – IMTheNachoMan

+0

Ich denke, Sie müssen mehr Code für uns zeigen, warum es zu früh feuert .., – IMTheNachoMan

+0

scheint es zu funktionieren, aber durch das Entfernen der Ergebnisse bevölkern die Dropdown-Liste unverändert :( –

Antwort

0

2 Date-Objekte zu vergleichen, .getTime() verwenden, um die Anzahl der Millisekunden seit dem 1. Januar 1970.

Arbeits Code zu erhalten:

while (iDate.getTime() < yearend.getTime()) { 

jedoch DOM-Manipulation manchmal mit JS Laufzeit nicht synchronisiert ist, so .value der Eingabe kann falsches Datum zurückgeben. Sie haben einige Argumente an Funktionen übergeben, aber nie benutzt.

überprüfen meine Geige aus - https://jsfiddle.net/atao634u/

function getDates() { 
    var year = document.getElementById('year').value; 
    year = new Date(year, 0, 1, 0, 0, 0, 0); 
    if (year.getDay() == 0) { 
    day=1; 
    year = year.setDate(day); 
    year = new Date(year); 
    } 
    else if (year.getDay() != 1) { 
    day = 8-(year.getDay()); 
    year = year.setDate(day); 
    year = new Date(year); 
    } 
    getendDates(year); 
    document.getElementById('yearstart').value = year; 

} 
function getendDates(yearstart) { 
    var year = (document.getElementById('year').value); 
    year++; 
    year = new Date(year, 0, 1, 0, 0, 0, 0); 
    if (year.getDay() == 0) { 
    day=1; 
    year = year.setDate(day); 
    year = new Date(year); 
    } 
    else if (year.getDay() != 1) { 
    day = 7-(year.getDay()); 
    year = year.setDate(day); 
    year = new Date(year); 
    } 
    document.getElementById('yearend').value = year; 
    getWeeks(yearstart, year); 
} 


function getWeeks(yearstart, yearend) { 
    document.getElementById("weekselect").innerHTML=""; 
    //var yearstart = new Date(document.getElementById('yearstart').value); 
    //var yearend = new Date(document.getElementById('yearend').value); 
    var iDate = new Date(yearstart); 

    while (iDate.getTime() < yearend.getTime()) { 
    var newele = document.createElement('option'); 
    newele.text = toJSONLocal(iDate); 
    document.getElementById('weekselect').appendChild(newele); 
    iDate.setDate(iDate.getDate() + 7) 
    } 
} 

function toJSONLocal (date) { 
    var local = new Date(date); 
    local.setMinutes(date.getMinutes() - date.getTimezoneOffset()); 
    return local.toJSON().slice(0, 10); 
} 
+0

große Antwort, ich hatte nicht in Betracht gezogen, einen Zeitvergleich zu verwenden, da ich mehr an PHP-Datumsmanipulation gewöhnt bin! Rookie-Fehler meinerseits, aber das Ausführen der Änderungen hat sofort funktioniert! –

Verwandte Themen