我正在尝试实现日期类型字段。我将数据分为3个选择字段,分别为日,月和年,如下所示:
<div id="CREATEDDATE" class="item" >
<label>Date Opened</label>
<select
id="CREATEDDATEdd"
class="dd"
date="CREATEDDATE"
onfocus="focusdiv(event)"
onblur="defocusdiv(event)"
></select>
<select
id="CREATEDDATEmm"
class="mm"
date="CREATEDDATE"
onfocus="focusdiv(event)"
onblur="defocusdiv(event)"
></select>
<select
id="CREATEDDATEyy"
class="yy"
date="CREATEDDATE"
onfocus="focusdiv(event)"
onblur="defocusdiv(event)"
></select>
</div>
在updateFields
函数中,我正在测试元素的nodeName
以决定如何处理数据。如果元素是DIV
我通过调用drawDate
函数来处理它,传入元素的参数和ROW中的值来填充选择字段。
function updateFields(result) {
if (result[myForm.name]) {
var fields = result[myForm.name][1];
for (var fieldName in fields) {
var el = document.getElementById(fieldName);
if (el) {
switch (el.nodeName){
case "INPUT":
el.value = fields[fieldName];
break;
case 'SELECT':
fill(el, fields[fieldName]);
el.value = fields[fieldName];
break;
case "DIV":
drawDate(el, fields[fieldName]);
break;
};
};
}
}
}
fieldChangeHandler
检查调用<select>
元素是否包含自定义date
属性,该属性标识我们正在更新的日期字段。
如果是,我们使用dd,mm,yy <select>
元素中设置的值创建Date对象并运行fieldUpdate
函数,如下所示:
function fieldChangeHandler(event) {
switch (event.srcElement.nodeName){
case "INPUT":
myForm.fieldUpdate(event.srcElement.id, event.target.value);
break;
case 'SELECT':
if(event.srcElement.attributes["date"]){
var dt = new Date(0);
dt.setFullYear(
$('#'+event.srcElement.attributes["date"].nodeValue+'yy')[0].value,
$('#'+event.srcElement.attributes["date"].nodeValue+'mm')[0].value,
$('#'+event.srcElement.attributes["date"].nodeValue+'dd')[0].value
);
myForm.fieldUpdate(event.srcElement.attributes["date"].nodeValue, dt);
} else {
myForm.fieldUpdate(event.srcElement.id, event.target.value);
}
break;
};
}
最后,我有drawDate
函数,它会在<option>
的第一次调用中填充updateFields
。来自updateFields
的后续调用会在相应的<selected>
上设置<option>
属性,以使控件与表单列中的数据保持同步:
function drawDate(el,sel){
var i, dt = new Date(sel);
var monthNames = ["January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"
];
var dd = ($('#'+el.id+'dd')[0].options.length==0);
for (i=1; i<32;i++) {
if (i == dt.getDate()){
if(dd){
$("#"+el.id+"dd").append('<option selected value="'+ i +'">'+ i +'</option>');
}else{
$('#'+el.id+'dd')[0].options[(i-1)].selected = true;
}
} else {
if(dd){
$('#'+el.id+"dd").append('<option value="'+ i +'">'+ i +'</option>')
}else{
$('#'+el.id+'dd')[0].options[(i-1)].selected = false;
};
};
};
var mm = ($('#'+el.id+'mm')[0].options.length==0);
for (i=0; i<12;i++) {
if (i == dt.getMonth()){
if(mm){
$("#"+el.id+"mm").append('<option selected value="'+ i +'">'+ monthNames[i] +'</option>');
}else{
$('#'+el.id+'mm')[0].options[(i)].selected = true;
};
} else {
if(mm){
$('#'+el.id+"mm").append('<option value="'+ i +'">'+ monthNames[i] +'</option>');
}else{
$('#'+el.id+'mm')[0].options[(i)].selected = false;
};
};
};
var currentTime = new Date();
var year = currentTime.getFullYear();
var yy = ($('#'+el.id+'yy')[0].options.length==0);
var ind = 0;
for (i=(year + 1); i>(year - 3);i--) {
if (i == dt.getUTCFullYear()){
if(yy){
$("#"+el.id+"yy").append('<option selected value="'+ i +'">'+ i +'</option>');
}else{
$('#'+el.id+'yy')[0].options[ind].selected = true;
};
} else {
if(yy){
$('#'+el.id+"yy").append('<option value="'+ i +'">'+ i +'</option>');
}else{
$('#'+el.id+'yy')[0].options[ind].selected = false;
};
};
ind ++;
};
}
当我编辑日期时,fieldChangeHandler
函数会将所选日期计算为Sat Oct 07 2017 00:00:00 GMT+0100 (GMT Daylight Time)
。这是我在表单中设置的正确日期。
所选元素的自定义date
属性包含列名:
event.srcElement.attributes["date"]
date="CREATEDDATE"
因此使用以下参数调用表单fieldUpdate
函数:
myForm.fieldUpdate("CREATEDDATE", "Oct 07 2017 00:00:00 GMT+0100 (GMT Daylight Time)");
完成fieldUpdate
后,调用updateFields
来刷新屏幕,但现在:
fields["CREATEDDATE"] = "2017-10-06T00:00:00.000Z"
在设置CREATEDDATE
功能中的fieldUpdate
和回复updateFields
之间,我们似乎已经失去了一天......(这可能是星期六!)
我使用新日期更新字段:
function minimaltest() {
var dt = new Date(0);
myForm.fieldUpdate(
"CREATEDDATE",
dt.setFullYear(2017, 0, 1)
);
}
服务器回调updatefields
函数:
function updateFields(result) {
...
}
但结果不包含我传入的日期......
result = Object {CUSTOMERS: Object}
CUSTOMERS:
Object
1:Object
CREATEDDATE:"2017-02-01T00:00:00.000Z"
有趣的是,与dt.setFullYear(2017, 0, 20)
(20/01/17)相同的调用会返回非法日期错误,就像正在切换月份和日期组件一样。
Object {
"type": "error",
"code": "stop",
"message": "Illegal date.",
"form": "Object",
"fatal": false
}
答案 0 :(得分:1)
这里的一个问题是,正在通过的日期包含英国夏令时的偏移量(/在雨中看窗外。对于给定的“夏天”值,我猜)。
BST比预期的UTC时间戳晚60分钟,因此通过的日期是日期 - 我们预期的值前一天的60分钟或23:00。
我们可以使用toISOString
Date.UTC Date(
创建UTC日期(无偏移量),而不是转换日期+偏移量())
,如下所示:
var dt = new Date(
Date.UTC(
$('#'+event.srcElement.attributes["date"].nodeValue+'yy')[0].value,
$('#'+event.srcElement.attributes["date"].nodeValue+'mm')[0].value,
$('#'+event.srcElement.attributes["date"].nodeValue+'dd')[0].value
)
);
但是,当我指定时,我仍然会收到Illegal date
错误,而且&gt; 12 ...
非法日期是由配置中使用美国英语(3)而非英国英语(2)引起的。 (DOH!)
var config = {
url: 'https://erpdemo.emerge-it.co.uk',
language: 2,
...
};