跳转到内容

OpenClinica 用户手册/年龄字段

来自维基教科书,开放世界中的开放书籍

年龄计算

[编辑 | 编辑源代码]

有时您可能希望计算研究对象的年龄,例如在签署知情同意书的日期。您可以使用以下脚本进行此操作,该脚本使用三个 CRF 项目

  • 出生日期,DateOfBirth,
  • 另一个日期,OtherDate,例如签署知情同意书的日期,以及
  • 将保存计算年龄的字段,CalculatedAge。

识别三个项目

[编辑 | 编辑源代码]

该 jscript 使用从 CRF 项目读取的三个变量,但在它可以执行此操作之前,我们必须在 CRF 中为它们添加标签。我们使用 <spanid=xxx>-tag 完成此操作。我们将这些标签放在左侧或右侧项目文本中。

labeling in the CRF
在 CRF 中添加标签


这是该脚本,您可以将其放置在包含项目的 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();
});
华夏公益教科书