【发布时间】:2021-07-06 14:15:39
【问题描述】:
我现在已经多次尝试在 HTML 中同时使用事件监听器、onchange 和 oninput 函数调用,并且在谷歌上搜索了好几天,但没有找到解决问题的方法。我试图在函数末尾调用 return ,但由于它无限而出错。我是使用 JS 的程序员的初学者,所以我现在向你们寻求帮助。
我想要做的是根据权重输入更新文本框。我有一个函数(estVentilasjon),其中包含许多“else ifs”来确定文本框的数据输入应该是什么,具体取决于患者的体重。但是,当我尝试实时更改患者体重 (id vekt) 时,它不会重新运行该功能,并且只有在我刷新页面时才会起作用。
如果有人能指出我正确的方向,将不胜感激。
const months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
function ageCalculate() {
let today = new Date();
let inputDate = new Date(document.getElementById("fdato").value);
let birthMonth, birthDate, birthYear;
let birthDetails = {
date: inputDate.getDate(),
month: inputDate.getMonth() + 1,
year: inputDate.getFullYear()
};
let currentYear = today.getFullYear();
let currentMonth = today.getMonth() + 1;
let currentDate = today.getDate();
leapChecker(currentYear);
if (
birthDetails.year > currentYear ||
(birthDetails.month > currentMonth && birthDetails.year == currentYear) ||
(birthDetails.date > currentDate && birthDetails.month == currentMonth && birthDetails.year == currentYear)
) {
displayResult("-", "-", "-");
return;
}
birthYear = currentYear - birthDetails.year;
if (currentMonth >= birthDetails.month) {
birthMonth = currentMonth - birthDetails.month;
} else {
birthYear--;
birthMonth = 12 + currentMonth - birthDetails.month;
}
if (currentDate >= birthDetails.date) {
birthDate = currentDate - birthDetails.date;
} else {
birthMonth--;
let days = months[currentMonth - 2];
birthDate = days + currentDate - birthDetails.date;
if (birthMonth < 0) {
birthMonth = 11;
birthYear--;
}
}
displayResult(birthDate, birthMonth, birthYear);
estWeight(birthDate, birthMonth, birthYear);
}
function displayResult(bDate, bMonth, bYear) {
if (bYear >= 1) {
document.getElementById("alder").value = bYear + " år " + bMonth + " måneder";
} else if (bMonth >= 1) {
document.getElementById("alder").value = bMonth + " måneder";
} else {
document.getElementById("alder").value = bDate + " dager";
}
}
function leapChecker(year) {
if (year % 4 == 0 || (year % 100 == 0 && year % 400 == 0)) {
months[1] = 29;
} else {
months[1] = 28;
}
}
function estWeight(bDate, bMonth, bYear) {
if (bYear >= 5) {
document.getElementById("estvekt").value = 4 * bYear;
} else if (bYear >= 1) {
document.getElementById("estvekt").value = 2 * bYear + 5;
} else if (bYear <= 1) {
document.getElementById("estvekt").value = bMonth + 9 / 2;
}
}
var vektventilasjon = document.getElementById("vekt").value;
function estVentilasjon() {
if (vektventilasjon >= 2 && vektventilasjon < 3) {
document.getElementById("frekv").value = "35";
document.getElementById("minvol").value = "525";
document.getElementById("tv").value = "15";
} else if (vektventilasjon >= 3 && vektventilasjon < 4) {
document.getElementById("frekv").value = "35";
document.getElementById("minvol").value = "700";
document.getElementById("tv").value = "20";
} else if (vektventilasjon >= 4 && vektventilasjon < 5) {
document.getElementById("frekv").value = "34";
document.getElementById("minvol").value = "1020";
document.getElementById("tv").value = "30";
} else if (vektventilasjon >= 5 && vektventilasjon < 6) {
document.getElementById("frekv").value = "33";
document.getElementById("minvol").value = "1155";
document.getElementById("tv").value = "35";
} else if (vektventilasjon >= 6 && vektventilasjon < 7) {
document.getElementById("frekv").value = "33";
document.getElementById("minvol").value = "1485";
document.getElementById("tv").value = "45";
} else if (vektventilasjon >= 7 && vektventilasjon < 8) {
document.getElementById("frekv").value = "32";
document.getElementById("minvol").value = "1600";
document.getElementById("tv").value = "50";
} else if (vektventilasjon >= 8 && vektventilasjon < 9) {
document.getElementById("frekv").value = "31";
document.getElementById("minvol").value = "1860";
document.getElementById("tv").value = "60";
} else if (vektventilasjon >= 9 && vektventilasjon < 10) {
document.getElementById("frekv").value = "31";
document.getElementById("minvol").value = "2015";
document.getElementById("tv").value = "65";
} else if (vektventilasjon >= 10 && vektventilasjon < 12) {
document.getElementById("frekv").value = "30";
document.getElementById("minvol").value = "2250";
document.getElementById("tv").value = "75";
} else if (vektventilasjon >= 12 && vektventilasjon < 14) {
document.getElementById("frekv").value = "29";
document.getElementById("minvol").value = "2610";
document.getElementById("tv").value = "90";
} else if (vektventilasjon >= 14 && vektventilasjon < 16) {
document.getElementById("frekv").value = "27";
document.getElementById("minvol").value = "2700";
document.getElementById("tv").value = "100";
}
}
function callCalculations() {
ageCalculate();
estWeight();
}
* {
font-family: Arial, Helvetica, sans-serif;
}
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 0.4fr 1.2fr 1.4fr;
grid-auto-rows: 1fr;
gap: 5px 5px;
grid-auto-flow: row;
grid-template-areas: "Blank Content Inputinfo" "Blank Content Suggested";
}
.Content {
grid-area: Content;
text-align: center;
border-radius: 15px;
border: 1px solid #000000;
padding: 10px;
width: auto;
height: 200px;
}
.Inputinfo {
grid-area: Inputinfo;
border-radius: 15px;
border: 1px solid #000000;
padding: 10px;
width: 250px;
height: auto;
}
.Suggested {
grid-area: Suggested;
border-radius: 15px;
border: 1px solid #000000;
padding: 10px;
width: 250px;
height: 50px;
}
.Header {
grid-area: Header;
}
h1 {
color: white;
font-weight: bold;
text-align: center;
}
html,
header,
body {
margin: 0;
padding: 0;
font-family: Arial, Helvetica, sans-serif;
}
/* Style the top navigation bar */
.topnav {
background-image: linear-gradient(to right, rgba(21, 42, 67, 1), rgba(88, 159, 209, 1));
height: auto;
overflow: hidden;
}
i {
vertical-align: middle;
}
label {
font-size: 12px;
display: inline-block;
float: justify;
clear: left;
width: 125px;
text-align: justify;
margin: 2px;
}
input {
font-size: 12px;
display: inline-block;
float: justify;
text-align: left;
vertical-align: top;
position: relative;
width: 100px;
margin: 2px;
}
/* Style the footer */
.footer {
background-color: #f1f1f1;
padding: 10px;
text-align: center;
}
<!DOCTYPE html>
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta content="utf-8" http-equiv="encoding">
<html>
<head>
<title>Barneanestesi legemiddelkalkulator</title>
<link type="text/css" rel="stylesheet" href="./styles.css" />
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
</head>
<body>
<div class="topnav">
<h1>Velkommen til barneanestesi legemiddelkalkulatoren!</h1>
</div>
<br>
<div class="container">
<div class="Content">
<span class="Ventilasjon">
<p><b><u>Ventilasjon</u></b></p>
<label for="tv"><b>Tidalvolum:</b></label>
<input type="text" id="tv" name="tv"<br>
<label for="frekv"><b>Frekvens:</b></label>
<input type="text" id="frekv" name="frekv"><br>
<label for="minvol"><b>Min volum:</b></label>
<input type="text" id="minvol" name="minvol"><br>
</span>
</div>
<div class="Inputinfo">
<label for="gutt"><i class="material-icons">male</i><b>Gutt</b></label>
<input type="radio" id="gutt" name="gender" value="Gutt">
<label for="jente"><i class="material-icons">female</i><b>Jente</b></label>
<input type="radio" id="jente" name="gender" value="Jente">
<label for="initialer"><i class="material-icons">assignment</i><b>Initialer:</b></label>
<input type="text" id="initialer" name="initialer"><br>
<label for="fdato"><i class="material-icons">cake</i><b>Fødselsdato:</b></label>
<input type="date" id="fdato" name="fdato" oninput="callCalculations()" required><br>
<label for="diagnose"><i class="material-icons">search</i><b>Diagnose:</b></label>
<input type="text" id="diagnose" name="diagnose"><br>
<label for="operasjon"><i class="material-icons">local_hospital</i><b>Operasjon:</b></label>
<input type="text" id="operasjon" name="operasjon"><br>
<label for="hoyde"><i class="material-icons">person_outline</i><b>Høyde (cm):</b></label>
<input type="text" id="hoyde" name="hoyde"><br>
<label for="Vekt"><i class="material-icons">monitor_weight</i><b>Vekt (kg):</b></label>
<input type="text" id="vekt" name="vekt" value="" oninput="estVentilasjon()">
<label for="Faste"><i class="material-icons">fastfood</i><b>Faste fra:</b></label>
<input type="time" id="faste" name="faste">
</div><br>
<div class="Suggested">
<label for="alder"><i class="material-icons">cake</i><b>Alder:</b></label>
<input type="text" id="alder" name="alder">
<label for="estvekt"><i class="material-icons">monitor_weight</i><b>Estimert vekt:</b></label>
<input type="text" id="estvekt" name="estvekt">
</div>
</div>
<script src="./ba.js"></script>
<div class="footer">
</div>
【问题讨论】:
-
您需要在函数in中检索输入的值:在任何处理程序运行之前检索它并且永远不要更新它。
-
我认为使用“document.getElementById”在用户在文本框中输入值后检索值,因为在 HTML 中调用函数是 oninput。我是否需要在我的函数之前创建一个事件监听器,而不是调用事件监听器,然后调用函数?我对 JS 很陌生,所以如果你不介意的话,我可能需要在正确的方向上多一点推动。非常感谢答案!
-
除了@DaveNewton 评论我想补充的内容之外,您的代码还有很多 DRY(不要重复自己)问题。例如。
document.getElementById("...")行多次出现,并且可以在 之前if .. else if() ... else if() ...部分进行评估。 -
@CarstenMassmann 可能有,但我对编程艺术还不太了解。我想我可以将信息存储在各种数组中,但我不知道如何。所以我的代码就是我知道如何去做的方式。您对进一步阅读有什么建议吗?或者我应该调查什么主题才能以更好的实践方式做到这一点?感谢所有帮助!
-
前段时间我回答了一个类似的问题,也许这会给你一些启发? stackoverflow.com/a/68071020/2610061
标签: javascript html