我有两个表单字段,用于存储前一个脚本的日期输出,每个输入的yearstart和yearend都填充了YYYY-MM-DD格式的日期。该脚本由嵌套的onchange函数触发,通过从另一个下拉列表中选择一年来填充这两个框,然后触发嵌套函数来填充第二个下拉选择项。
<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>
它正在发挥作用,但遗憾的是,如果我选择一年的价值大于已经选择的那一年,那么只有工作,所以2015年,2016年然后工作,但我还得到两年的日期而不是一个,所以我是不知道我错过了什么。我只能推测脚本在值更新之前触发,但嵌套脚本执行的顺序应该阻止它。
任何想法的人?
答案 0 :(得分:0)
要比较2个Date对象,请使用.getTime()
获取自1970年1月1日以来的毫秒数。
工作代码:
while (iDate.getTime() < yearend.getTime()) {
但是,DOM操作有时不与JS运行时同步,因此输入的.value
可能返回错误的日期。你把一些参数传递给函数但从未使用它。
查看我的小提琴 - 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);
}