Я пытаюсь создать калькулятор ИМТ, который отображает ИМТ пользователя после того, как он укажет свой рост и вес. Но результаты не будут отображаться в теге 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()"
Спасибо за ответ. Я учусь по ходу дела, реализовал все это, и наконец-то это работает.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я думаю, вам нужно перейти с:
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>.