OpenClinica 用户手册/年龄字段
外观
有时您可能希望计算研究对象的年龄,例如在签署知情同意书的日期。您可以使用以下脚本进行此操作,该脚本使用三个 CRF 项目
- 出生日期,DateOfBirth,
- 另一个日期,OtherDate,例如签署知情同意书的日期,以及
- 将保存计算年龄的字段,CalculatedAge。
该 jscript 使用从 CRF 项目读取的三个变量,但在它可以执行此操作之前,我们必须在 CRF 中为它们添加标签。我们使用 <spanid=xxx>-tag 完成此操作。我们将这些标签放在左侧或右侧项目文本中。
这是该脚本,您可以将其放置在包含项目的 section 的说明列中。
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script lang="Javascript">
$.noConflict();
jQuery(document).ready(function($){
var dobField = $("#DateOfBirth").parent().parent().find("input");
var signField = $("#OtherDate").parent().parent().find("input");
var ageField = $("#CalculatedAge").parent().parent().find("input");
ageField.attr("readonly", true);
var months = ["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"];
function calcYearsBetween(startDate, endDate) {
var years = (endDate.getFullYear() - startDate.getFullYear());
if (endDate.getMonth() < startDate.getMonth() || endDate.getMonth() == startDate.getMonth() && endDate.getDate() < startDate.getDate()) years--;
return years;
}
function parseDate(input){
var parts = input.split("-");
var myDate = new Date();
myDate.setFullYear(parts[2]);
myDate.setMonth(months.indexOf(parts[1].toLowerCase()));
myDate.setDate(parts[0]);
return myDate;
}
function yearsBetween(){
var dob = dobField.val();
var sign = signField.val();
var age="";
var curAge = ageField.val();
if(dob!=="" && sign!==""){
age = String(calcYearsBetween(parseDate(dob), parseDate(sign)));
}
if(curAge!==age){
ageField.val(age);
ageField.change();
}
}
dobField.blur(function(){
yearsBetween();
});
signField.blur(function(){
yearsBetween();
});
$("#srl").on("focus", function () {
yearsBetween();
});
$("#srh").on("focus", function () {
yearsBetween();
});
});
</script>
代码首先包含 jQuery 1.9.1。您也可以指向 OpenClinica 提供的版本。
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
此外,为了防止与 OpenClinica 代码可能发生的冲突,我们添加了 noConflict 语句
$.noConflict();
该脚本获取两个日期并创建两个日期对象,基于日、月和年。将月份与可用月份的数组进行比较,该数组在脚本开头声明。如您所见,这些月份使用英文符号,因此如果您用户的浏览器语言不同,请更改这些缩写。该脚本将给定的名称转换为小写,然后找到月份的序数,并使用该数字来设置月份。
myDate.setMonth(months.indexOf(parts[1].toLowerCase()));
然后通过减去年份并比较月份,必要时比较日期来计算年龄。
function calcYearsBetween(startDate, endDate) {
var years = (endDate.getFullYear() - startDate.getFullYear());
if (endDate.getMonth() < startDate.getMonth() || endDate.getMonth() == startDate.getMonth() && endDate.getDate() < startDate.getDate()) years--;
return years;
}
现在我们得到了年龄,但我们必须将其传输到我们的字段中,但前提是年龄确实发生了改变。此外,如果值确实发生了变化,我们将调用该字段的 change 方法,以确保 OpenClinica 将该值写入数据库。
if(curAge!==age){
ageField.val(age);
ageField.change();
}
当我们离开出生日期字段、签名字段或按下两个保存按钮(称为“srh”和“srl”)中的一个时,就会计算年龄。
dobField.blur(function(){
yearsBetween();
});
signField.blur(function(){
yearsBetween();
});
$("#srl").on("focus", function () {
yearsBetween();
});
$("#srh").on("focus", function () {
yearsBetween();
});