我目前正在使用Treehouse上的初学者JavaScript课程并继续坚持功能。为了更好地理解,我尝试创建一个计算器,将人类年代转换为狗年。到目前为止,这是我的代码:
HTML:
<div id="calculator">
<form>
<label>What is your current age in human years? <br>
<input type="text" id="humanYears"></label> <br>
<button type="text" id="calculate">Calculate</button>
</form>
</div>
JS:
function calculate() {
var humanYears = document.getElementById("humanYears").value;
var dogYears = (humanYears * 7);
document.write(dogYears);
}
document.getElementById("calculate").onclick = function(){calculate(); };
页面闪烁,我一直看到表格,没有结果。
我知道这段代码不正确,但我不明白为什么。我也知道我可以从Github复制其他人的代码,并且有一个功能正常的计算器,但这样做会破坏学习的目的。我宁愿知道为什么我的代码不起作用以及我可以做些什么来解决它。 (我加倍,三重检查HTML和JS文件是否正确链接,它们是什么。)
那里的任何JS巫师都会关心进来吗?
编辑:当我在表格中输入年龄时,它只会重新加载,而不是显示狗年的年龄(这是期望的结果)。
答案 0 :(得分:1)
您的代码有效,尽管您已经表明它不是很好。
function calculate() {
var humanYears = document.getElementById("humanYears").value;
var dogYears = (humanYears * 7);
document.write(dogYears);
}
document.getElementById("calculate").onclick = function(){calculate(); };
&#13;
<div id="calculator">
<form>
<label>What is your current age in human years? <br>
<input type="text" id="humanYears"></label> <br>
<button type="text" id="calculate">Calculate</button>
</form>
</div>
&#13;
一些需要改进的注意事项:
submit
个按钮(<input type="submit" value="Calculate">
或<button type="submit">Calculate</button>
var dogYear = humanYears * 7;
就足够了id
属性,尽管这样可以轻松快速地进行DOM查询submit
事件,而不是按钮的click
事件,因为如果我提交表单,您将要处理按键盘上的 Enter calculate
附近的额外功能,document.getElementById('calculate').onclick = calculate;
就足够了考虑到这些注意事项,以下是我如何改进您的计算器:
var form = document.getElementById('calculator');
function calculate() {
var years = form['humanYears'].value,
dogYears = years * 7;
document.getElementById('answer').innerText = dogYears;
}
form.addEventListener('submit', calculate, false);
&#13;
<form id="calculator">
<p>
<label>
What is your current age in human years?<br>
<input type="text" name="humanYears">
</label>
</p>
<p>
<button type="submit">Calculate</button>
</p>
<p>
Answer: <span id="answer"></span>
</p>
</form>
&#13;
我改变的事情:
<p>
标签来控制空格而不是<br>
,如果我选择的话,这将进一步让我自定义CSS演示。您无法设置<br>
元素的样式。addEventListener
绑定了我的事件处理程序,这种方式不那么突兀答案 1 :(得分:0)
主要问题是document.write
没有按照你的想象做到:
注意:当document.write写入文档流时,在已关闭(加载)的文档上调用document.write会自动调用document.open,这将清除文档。
请参阅document.write
的文档:https://developer.mozilla.org/en-US/docs/Web/API/Document/write
更好的方法是在页面上放置一个空元素,然后更改内容:
function calculate() {
var humanYears = document.getElementById("humanYears").value;
var dogYears = humanYears * 7;
document.getElementById('output').innerText = dogYears;
}
document.getElementById("calculate").onclick = calculate;
<div id="calculator">
<form>
<label>What is your current age in human years? <br>
<input type="text" id="humanYears">
</label>
<br>
<button type="button" id="calculate">Calculate</button>
<div id="output"></div>
</form>
</div>
我还对您的脚本进行了一些小改进:
type="button"
- 否则您的表单将会提交,并且当您单击按钮时页面将重新加载。在这种情况下,你实际上甚至不需要form
元素,但它不会伤害任何东西。或者,您可以将return false
添加到calculate
函数中 - 这会告诉浏览器不要提交表单,因此不会重新加载页面calculate
函数包装在另一个函数中。在javascript中,函数实际上可以像变量一样传递。这就是我将onclick
的值设置为calculate
的原因 - 但请注意我遗漏了()
。您希望onclick成为函数的引用,否则calculate
函数将立即执行,onclick
将被设置为函数的返回值 - 在这种情况下,那将是undefined
。答案 2 :(得分:0)
这里您的工作代码尽可能少地改变:
<div id="calculator">
<form>
<label>What is your current age in human years? <br>
<input type="text" id="humanYears"></label> <br>
<button type="text" id="calculate">Calculate</button>
</form>
</div>
<script>
function calculate() {
var humanYears = document.getElementById("humanYears").value;
var dogYears = (humanYears * 7);
document.write(dogYears);
}
document.getElementById("calculate").onclick = function(){calculate(); return false; };
</script>