这应该是一个琐事问题网站,点击按钮后反映用户的答案是否正确。我的问题是与错误答案相关的'for'循环。
document.addEventListener('DOMContentLoaded', function(){
// Part 1
event.preventDefault();
let correctans = document.getElementById('correct1');
correctans.addEventListener('click', function(){
correctans.style.backgroundColor = 'green';
document.querySelector('#response1').innerHTML = 'Correct!';
});
let incorrectans = document.querySelectorAll('.incorrect')
/*
querySelectorAll() returns a static (not live) NodeList representing a list of the document's elements
that match the specified group.
It's possible to loop over the items in a NodeList using a for loop
*/
let i = 0;
for (i = 0; i < incorrectans.length; i++)
{
incorrectans[i].addEventListener('click', function(){
incorrectans[i].style.backgroundColor = 'red';
document.querySelector('#response1').innerHTML = 'Incorrect.';
console.log(i);
})
}
下面是我的HTML代码
<div class="section">
<h2>Part 1: Multiple Choice </h2>
<p id="response1"> </p>
<hr>
<!-- TODO: Add multiple choice question here -->
<h3>What is the largest rodent on Earth?</h3>
<button type="button" value="answer" class="incorrect">Beaver</button>
<button type="button" value="answer" class="incorrect">Squirrel</button>
<button type="button" value="correctanswer" id="correct1">Capybara</button>
<button type="button" value="answer" class="incorrect">Rat</button>
</div>
当我在'for'循环中使用变量'i'之前将其赋值为0时,使用console.log()进行调试显示'i'并不反映我为其赋值的值,也不反映它递增后的值。
'for'循环只有在循环本身声明了'i'时才起作用。为什么会这样?
同样,我还有一个问题,addEventListener('DOMContentLoaded')
必须在JavaScript中使用吗?
4条答案
按热度按时间5m1hhzi41#
我得到了
i
没有得到十进制值,所以在检查你的代码后,我找到了函数部分:-u打开了一个函数,没有传递
i
变量,这就是为什么u没有看到预期的值,所以如果u想要纠正这个u需要把console.log(i);
的函数括号或传递i
变量到ur函数。y0u0uwnf2#
事件侦听器异步工作。如果你在循环外声明了一个变量,所有的事件都还没有被触发,但是循环已经运行了。在循环运行之后,我们将得到的最终值将是i = 3(因为循环在满足结束条件之后会增加一次)。
现在,当我们点击按钮时,事件侦听器会触发。它将i的值读取为3,但不正确的数组只包含索引为0,1,2的3个值。所以才有错误。
如果在循环内声明,则事件侦听器存储i的当前值。从而正确运行。
要正确理解这一点,你可以做的是运行循环,然后在循环外给予i一个不同的值,比如1。但在这种情况下,如果不会抛出错误,但它总是红色的选项与索引1,无论您选择的选项。
最好是在循环中声明let。您也可以使用此
同样,你不必总是在代码中使用addEventListener('DOMContentLoaded ')。但是在上面的代码中,你使用了dom元素的事件监听器。最好是等着他们来加载。它们是可选的,比如defer,它表示这个脚本在文档被解析之后执行。可以使用
xghobddn3#
在for循环中使用变量i之前,当您将0赋值给它时,变量i不反映您赋值给它的值,也不反映它递增后的值,原因是变量i在for循环之外声明,因此每次循环运行时,它的值不会重置为0。相反,它保留了它在上一次循环迭代结束时的值。这就是为什么for循环只在循环本身声明变量i时才起作用,因为这样每次循环运行时它都被重置为0。
至于您的第二个问题,addEventListenerDOMContentLoaded函数并非在所有情况下都是必需的。它用于确保JavaScript代码仅在HTML文档被浏览器完全加载和解析后才执行。这很重要,因为如果JavaScript代码试图访问尚未加载的HTML元素,它将无法正常工作。但是,如果您的代码位于HTML文档的末尾,就在结束body标记之前,它将在加载所有HTML元素之后执行,因此在这种情况下可能不需要使用
addEventListenerDOMContentLoaded
。这个答案是由我创建的CodeMe自动生成的。如果您觉得有用,现在就在您最喜欢的IDE中尝试CodeMe!如果你还有其他问题,也可以直接联系我。
guicsvcw4#
For
循环有三个部分,即初始化,条件,增量。初始化是可选的,因此您可以将其留空。但是如果你把i=0
放在初始化部分,一个新的变量将被创建为该循环的作用域。如果你想从外部使用一个值,你必须将初始化部分留空,或者简单地将变量名放在那里,不给任何值。现在,您遇到的问题是因为您在声明click-event的回调函数时使用了对变量i
的引用,而没有传递它的值。因此,当事件被触发时,它不再在循环中,因为循环只是为了添加事件侦听器,回调函数从循环外部获取i
的全局值。而且你根本不需要使用
addEventListener('DOMContentLoaded')
。你只需要把你的脚本放在body的末尾,或者如果你把它放在其他地方,就像<script src="main.js" defer > </script>
一样,在你的脚本标签中添加一个defer
属性。defer
使脚本在加载整个文档时运行。