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();
});