2 回答
![?](http://img1.sycdn.imooc.com/5458471300017f3702200220-100-100.jpg)
TA贡献1794条经验 获得超7个赞
问题是您要为每次尝试迭代 3 次尝试。
对于所有尝试,您需要全局迭代。
换句话说,跟踪函数之外的尝试,否则每次调用函数时,您都会将尝试重置为 3 - 它永远不会失败。
这是我对您的代码的重构,它还修复了一些其他问题并对其进行了优化。
(() => {
let attempts = 3,
input_el = document.getElementById('textField'),
result_el = document.getElementById('valueReturned');
window.getValue = () => {
let input = input_el.value,
letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
correct = letters.includes(input),
msg;
if (!attempts)
msg = 'No attempts left!';
else if (!input)
msg = "No input!";
else if(!correct) {
attempts--;
switch (attempts) {
case 2:
msg = 'Two tries left!'
break;
case 1:
msg = 'One more try!';
break;
case 0:
msg = 'That was your last try! Get lost!';
break;
}
} else
msg = 'You guessed right!';
result_el.innerHTML = msg;
}
})();
一些注意事项:
指示性地命名你的变量
将您的 JS 与您的 HTML 分开 - 将其放入专用
.js
文件中。let
这些var
天使用onclick
考虑集中式事件处理,而不是通过属性内联 JS 。这也意味着我们不必声明一个全局函数window
供您onclick
参考。我们将整个内容包装在 IIFE(立即调用函数表达式)中,以防止污染全局命名空间。
想想每次事件触发时不需要复制的内容。我们不需要每次都从 DOM 中获取对相同元素的引用——让我们在函数之外进行。
array.includes(val)
相当于array.indexOf(val) !== -1
。我还让用户无法进行超过 3 次尝试。
![?](http://img1.sycdn.imooc.com/545861f00001be3402200220-100-100.jpg)
TA贡献2037条经验 获得超6个赞
让我们看看你的逻辑
<script>
function getValue(){
var input = document.getElementById("textField").value;
var letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"] ;
var a = letters.indexOf(input);
在这一点上,您打开了一个脚本标签并声明了一个函数getValue。然后你用 id 从 html 元素中获取输入,用 10 个字母"textField"初始化一个数组,然后搜索,返回它的索引。但是,这会导致输入仅被读取一次。然后它将执行您的 for 循环进行 3 次迭代,从而产生潜在的有害错误。letterslettersinput
这样想,
您的功能需要在某个地方启动。通过将其嵌入到 html 中,它将出现onclick()在输入下方的按钮中。这意味着每次调用该函数时,都会读取一次输入,并且循环在同一个输入上运行 3 次。我将首先在您的getValue函数之外创建一个变量——我们将调用它——这attempts将允许我们在每次运行函数时更新变量。然后摆脱 for 循环,并使用条件分支,例如
var attempts = 0;
function getValue(){
var input = document.getElementById("textField").value;
var letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"] ;
var a = letters.indexOf(input);
if (attempts < 3) {
// check if input is right
if (input != "" && a != -1) {
alert("success");
}
attempts += 1;
}
// no else statement needed to terminate the program
// simply don't handle occurrences of attempts greater than 3
}
请评论您不确定的任何内容
添加回答
举报