我正在处理一个网页,其中有一个带有onclick事件侦听器的按钮,用于在动态生成的元素之间切换。第一次单击按预期工作,但第一次单击后,事件侦听器似乎不再触发。以下是我的JavaScript的相关部分:
document.addEventListener('DOMContentLoaded', function () {
// ... (other initialization code)
trdmDisplayed = 1;
nextbtn = document.querySelector('.nextbtn');
nextbtn.addEventListener('click', function () {
console.log(`trdm when the button is first clicked: ${trdmDisplayed}`);
currentlyDisplayed = document.querySelector(`.indexdiv .shading-div:nth-child(${trdmDisplayed})`);
currentlyDisplayed.style.display = "none";
trdmDisplayed = (trdmDisplayed % 20) + 1;
toDisplay = document.querySelector(`.indexdiv .shading-div:nth-child(${trdmDisplayed})`);
toDisplay.style.display = "block";
});
});
字符串
这是我的HTML:
<div class="movies-container">
{%for movie in movies %}
<div class="shading-div" id="trdm-{{movie.id}}">
/*
other elements...
*/
<div>
<button class="nextbtn" ><i class="fas fa-arrow-right"></i></button>
</div>
</div>
{%endfor%}
</div>
型
补充说明:动态生成的元素由一组固定的20个元素组成,第一次点击按钮后,第一个元素成功从element.style.display =“block”;到“none”,第二个元素按预期从“none”转换到“block”,所有内容都记录到控制台上。但是,在第二次单击按钮时,没有信息被记录到控制台,这表明根本没有调用事件侦听器。
我尝试使用ChatGPT来查找错误,但没有任何工作,我已经修改了我的JavaScript很多次,但仍然没有任何工作。我已经检查了我的html和我的css的任何潜在的错误,并不能找到任何。
2条答案
按热度按时间umuewwlo1#
你的for循环在DOM中创建了多个“next”按钮,而你的
querySelector()
只选择了第一个创建的按钮,所以click事件监听器只绑定到第一个按钮:字符串
这意味着,当您隐藏第一个“next”按钮并显示下一个按钮时,单击事件侦听器不会添加到您正在显示的新按钮中,因此单击将不起作用。
相反,让next按钮的创建在for循环之外,这样你就只有一个按钮,这样当你隐藏生成的元素之一时,你就不会隐藏它:
型
顺便说一下,确保你用
const
/let
声明了你的变量,比如trdmDisplayed
,nextbtn
和currentlyDisplayed
,这样它们就不会成为全局变量,并且保持在定义它们的地方,这将有助于避免潜在的混乱bug。pexxcrt22#
在DOM contentloaded侦听器之外的nextbtn中分配按钮,或者删除该侦听器,然后检查它是否工作。