Я пытаюсь создать калькулятор ИМТ, который отображает ИМТ пользователя после того, как он укажет свой рост и вес. Но результаты не будут отображаться в теге p.
let myHeight = document.getElementById("height");
let myWeight = document.getElementById("weight");
let answer = document.getElementsByClassName("result");
function BMIcalc() {
if (myHeight.value === "" || myWeight.value === "") {
alert("Please fill in your height and weight!");
} else{
const BMI = myWeight.value / myHeight.value**2;
answer.value = BMI;
}
});
<form>
<label for = "height">Please input your height:</label>
<input id = "height" type = "text" name = "" value = "" placeholder = "height">
<label for = "weight">Please input your weight:</label>
<input id = "weight" type = "text" name = "" value = "" placeholder = "weight">
<button onclick = "BMIcalc" type = "button" name = "button">Submit</button>
</form>
<h3>Your BMI is: </h3>
<p class = "result"></p>
Ответ не будет отображаться в теге p.
Однако, если я использую console.info(), результат отображается, что означает, что функция работает правильно. Но мне нужно иметь возможность показать результат пользователю.
Я также пробовал использовать:
let myHeight = document.getElementById("height");
let myWeight = document.getElementById("weight");
function BMIcalc() {
if (myHeight.value === "" || myWeight.value === "") {
alert("Please fill in your height and weight!");
} else{
const BMI = myWeight.value / myHeight.value**2;
const answer = BMI;
document.getElementsByClassName("result").innerText = answer;
}
}
Ничего не работает
Также обратите внимание: getElementsByClassName
возвращает HTMLCollection
, а не отдельный элемент.
Я очень надеюсь, что вы не используете h3
, потому что вам нравится, как он отображает текст, и вместо этого вы используете его для дальнейшего разделения существующего h2
.
помните, что все, что вы получаете от элементов input
, является строками, поэтому вам нужно parseFloat
их знать, прежде чем вы сможете выполнять с ними математические операции. Также помните, что абзацы не являются элементами формы и не имеют свойства .value
. И, конечно же: getElementsByClassName
возвращает список элементов, а не «только один». Если вам нужен только один, используйте document.querySelector
с селектором запроса, специфичным для вашего элемента абзаца.
добавив к предыдущим пунктам, ваш onclick = "BMIcalc" также должен быть "BMcalc()"
Спасибо за ответ. Я учусь по ходу дела, реализовал все это, и наконец-то это работает.
Я думаю, вам нужно перейти с:
document.getElementsByClassName("result").innerText = answer;
к:
document.getElementById("result").innerText = answer;
И позже в вашем HTML измените на:
<p id = "result"></p>
Но если вам действительно нужен класс в теге p, используйте в JS:
document.querySelector(".result").innerText = answer;
См. документацию по querySelector.
Вам нужен рефакторинг вашего кода:
function bmiCalc() {
let myheight = document.getElementById("height").value;
let myweight = document.getElementById("weight").value;
if (myheight === "" || myweight === "") {
alert("Please Enter number........")
} else {
let ans = myheight / myweight ** 2;
let resultElements = document.getElementsByClassName("result");
for (let i = 0; i < resultElements.length; i++) {
resultElements[i].innerHTML = "The BMI is: " + ans;
}
}
document.getElementById("height").value = "";
document.getElementById("weight").value = "";
}
<input type = "number" id = "height" name = "height" placeholder = "Enter your height" />
<input type = "number" id = "weight" name = "weight" placeholder = "Enter your weight" />
<button type = "button" value = "submit" onclick = "bmiCalc()">Submit</button>
<p class = "result">Pending....</p>
Чтобы решить эту проблему, вам следует перебрать коллекцию, возвращаемую методом getElementsByClassName, и обновить внутренний HTML-код каждого элемента индивидуально. <--- Нет, нет, нет, нет, нет. Используйте querySelectorAll() и прекратите использовать getElementsByClassName(), особенно циклически перебирая список активных узлов.
Кроме того, избегайте внутреннего HTML , когда строка не содержит HTML, поскольку innerHTML
влияет на производительность и безопасность. Вместо этого используйте textContent.
Внимательно посмотрите на HTML. Существует только один элемент с результатом класса, так зачем идти по пути коллекций?
предпочитаю использовать id="result" вместо класса в теге p и в функции js:
document.getElementById("result")
то вы можете использовать любой из них:
answer.innerHTML=BMI;
answer.innerText=BMI;
answer.textContent=BMI;
если вы хотите class="result", тогда предпочтите
document.querySelector(".result").innerHTML=BMI;
поскольку селектор getElementByClass выбирает все классы, имеющие classname="result":
для более подробной информации проверьте код:
<form>
<label for = "height">Please input your height in cms:</label>
<input id = "height" type = "text" name = "" value = "" placeholder = "height" />
<label for = "weight">Please input your weight in kgs:</label>
<input id = "weight" type = "text" name = "" value = "" placeholder = "weight" />
<button onclick = "BMIcalc()" type = "button" name = "button">Submit</button>
</form>
<h3>Your BMI is:</h3>
<p id = "result"></p>
let myHeight = document.getElementById("height");
let myWeight = document.getElementById("weight");
let answer = document.getElementById("result");
function BMIcalc() {
if (myHeight.value === "" || myWeight.value === "") {
alert("Please fill in your height and weight!");
} else {
const BMI = myWeight.value*100*100 / (myHeight.value * myHeight.value);
answer.innerHTML=BMI;
}
}
Некоторые вещи, которые вы захотите решить:
parseFloat
их, прежде чем вы сможете выполнять с ними математические операции (и всегда parseFloat
, а не parseInt
, поскольку в JS нет отдельного типа целых чисел, а функция parseInt
может делать действительно неожиданные вещи). если вы не знаете, требуется второй аргумент, указывающий, какую базу анализировать).value
, у них есть свойство .textContent
/.innerText
, как и у всех обычных (непустых) элементов DOM.getElementsByClassName
возвращает живую HTML-коллекцию, а не «только один элемент». Если вы хотите выбрать только один элемент, либо присвойте ему id
и получите его таким образом, либо используйте document.querySelector
с селектором запроса, специфичным для вашего элемента абзаца.Бонусный факт: элементы HTML с атрибутом id
автоматически доступны на стороне JS под этим именем (при условии, что строка id
является допустимым именем переменной JS). Таким образом, <input id = "height"....
автоматически станет переменной с именем height
на стороне JS, ее не нужно искать в DOM. (Но, конечно, если вы это делаете, не забудьте использовать id
имена, которые не конфликтуют со встроенными именами глобальных переменных JS!)
Итак, работая над всем этим:
// By giving everything id attributes, we don't need to search
// for any of the elements involved in the logic we're coding:
calculate.addEventListener(`click`, () => {
BMI.textContent = ``;
const h = parseFloat(height.value);
const w = parseFloat(weight.value);
// Note that parseFloat does not test if the entire input "was
// a number", it only parses things up to "when they stop being
// a number", So we need to check whether the conversion result
// actually matches the input. If not, that's bad input. So,
// turn the number back into a string, and see if it matches:
if (`${h}` !== height.value || `${w}` !== weight.value) {
return alert(`Please fill in your height in cm and weight in kg`);
}
// And let's not give people infinite precision, two
// digits after the decimal point should be plenty.
BMI.textContent = (w / (h/100) ** 2).toFixed(2);
});
<!--
there is no form here, we don't need to send any sort
of data to a server, we're just doing on-page calculation.
-->
<div>
<label for = "height">Please input your height:</label>
<input id = "height" placeholder = "height in cm">
</div>
<div>
<label for = "weight">Please input your weight:</label>
<input id = "weight" placeholder = "weight in kg">
</div>
<button id = "calculate">Calculate</button>
<h3>Your BMI is: <span id = "BMI"></span></h3>
Только теги типа
<input>
имеют атрибут «значение». Вы ищете.innerText
или.innerHTML
, чтобы установить содержимое тега<p>
.