Попытка вывести Age из DOB, а затем рассчитать баллы, используя операторы if..else - PullRequest
0 голосов
/ 22 декабря 2011

Я пытаюсь определить возраст пользователей по DOB с помощью сценария, затем в зависимости от этого возраста присуждаю им баллы за две области: федеральная (f) и квебекская (q) иммиграция, поскольку они обе рассчитывают возрастные баллы, у меня есть наборкоманды if ... else для начисления баллов и отображения их в двух текстовых полях.в настоящее время скрипт для вычисления точек parseInt представляет собой текстовое поле, в котором отображается возраст (это поле заполняется сценарием dobtoage), здесь мой код и предварительный просмотр в реальном времени .

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Quebec and Federal Immigration Points Calculator</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
</head>
<body>
<form name="form">
<p>Your Date of Birth (format:<strong>dd/mm/yyyy</strong>)</p><br />
<input onmouseout="showAge()" name="dob" id="dob" />
<p>Your Age</p><input name="age" type="text" style="font-size: 15px" value="" size="7" readonly>
<INPUT NAME="calc" VALUE="Calculate" TYPE="button" onClick="compute(this.form)"><br />
<input name="rsltf" type="text" style="font-size: 50px" value="" size="20" readonly /><br />
<input name="rsltq" type="text" style="font-size: 50px" value="" size="20" readonly />
</form>
<script type="text/javascript"> 
function showAge(){ 
var d =document.getElementById('dob').value.split('/'); 
var today=new Date(); 
var bday=new Date(d[2],d[1],d[0]); 
var by=bday.getFullYear(); 
var bm=bday.getMonth()-1; 
var bd=bday.getDate(); 
var age=0; var dif=bday; 
while(dif<=today){ 
var dif = new Date(by+age,bm,bd); 
age++; 
} 
age +=-2 ; 
form.age.value = age; 
} 
</script> 
<script type="text/javascript">
function compute(form)
{
var a = parseInt(form.age.value, 10) || 0; 
if (a == 17)
   {
   f = 2; q = 0; 
   }
   else if (a == 53)
   {
   f = 2; q = 0;
   }
   else if (17 > a > 53)
   {
   f = 0; q = 0;
   }
   else if (a == 19)
   {
   f = 6; q = 16;
   }
   else if (a == 51)
   {
   f = 6; q = 0;
   }
   else if (a == 18)
   {
   f = 4; q = 16;
   }
   else if (a == 20)
   {
   f = 8; q = 16;
   }
   else if (a == 50)
   {
   f = 8; q = 0;
   }
   else if (a == 52)
   {
   f = 4; q = 0;
   }
   else if (35 >= a >= 21)
   {
   f = 10; q = 16;
   }
   else if (a == 36)
   {
   f = 10; q = 14;
   }
   else if (a == 37)
   {
   f = 10; q = 12;
   }
   else if (a == 38)
   {
   f = 10; q = 10;
   }
   else if (a == 39)
   {
   f = 10; q = 8;
   }
   else if (a == 40)
   {
   f = 10; q = 6;
   }
   else if (a == 41)
   {
   f = 10; q = 4;
   }
   else if (a == 42)
   {
   f = 10; q = 2;
   }
   else if (a == 43)
   {
   f = 10; q = 0;
   }
   else if (50 >= a >= 44)
   {
   f = 10; q = 0;
   }
form.rsltf.value = f;
form.rsltq.value = q;   
}
</script>
</body>
</html>

1 Ответ

1 голос
/ 22 декабря 2011

Во-первых, вы странно вычисляете возраст.

Сделайте это:

var today = new Date(); 
var bday = new Date(d[2],d[1],d[0]);
var age = today.getFullYear() - bday.getFullYear();  //If you're born in 1980 then 2011-1980 means you're about 31 years old, this will give you the age if birthday has already passed

if(today.getMonth() < bday.getMonth() || (today.getMonth() == bday.getMonth() && today.getDate() < bday.getDate()))  
{
     age--;  //Reduce age by 1 if birthday hasn't passed
}

Что касается гигантской структуры elseif, то сначала я бы разбил ее на две отдельные структуры.Это позволяет вам использовать диапазоны в одном, которые недоступны в другом, чтобы сократить общую структуру.Возрастные диапазоны настолько перемешаны в нем, что я не очень-то стараюсь выбирать соответствующие структуры.Возможно, вы захотите использовать операторы switch case вместо if / elseif / else.

Кроме того, поместите ваши функции в голову там, где они принадлежат.Кроме того, вам нужна некоторая проверка ошибок в функции ShowAge () на случай, если это недопустимая дата.Кроме того, вам нужно использовать getElementById в идентификаторе формы, чтобы изменить его значение в ShowAge() в конце, в противном случае он не знает, что такое form.Итак, дайте вашей форме идентификатор и измените конец ShowAge() на:

document.getElementById('formid').age.value = age; 
...