跳轉到內容

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();
});
華夏公益教科書