javascript - 添加/删除事件监听器

标签 javascript html events event-listener

抱歉,如果这个问题很愚蠢。但我想重构一下我的代码并得到一些建议,但无法真正解决这个问题。我有一个 html 中的 div,其中包含 9 个按钮。像这样:

 <div class="board" id="board">
            <button class="button" id="0"></button>
            <button class="button" id="1"></button>
            <button class="button" id="2"></button>
            <button class="button" id="3"></button>
            <button class="button" id="4"></button>
            <button class="button" id="5"></button>
            <button class="button" id="6"></button>
            <button class="button" id="7"></button>
            <button class="button" id="8"></button>          
    </div>

我想知道是否可以将事件监听器添加到整个容器,然后分别为每个按钮删除它。这样做的要点是按钮只需单击一次。我尝试了这个,但它不起作用:

const buttonsContainer = document.querySelector('.board');

buttonsContainer.addEventListener('click', handleClick);

function handleClick(event){
    const button = event.target;
    console.log(button.id + " was clicked"); 
    button.removeEventListener('click', handleClick);  
}

我寻找解决方案,唯一发现的是设置超时:

setTimeout(() => {
        button.removeEventListener('click', handleClick);
    }, 0);

没明白这个,而且无论如何也行不通。

最佳答案

可以向容器元素添加一个事件监听器,然后分别为每个按钮删除它。

第二个问题是您要从事件处理函数本身内部的按钮中删除事件监听器。这意味着事件监听器仅在第一次单击按钮后被删除,但不会在后续单击中删除。

解决此问题的一种方法是从容器元素而不是按钮中删除事件监听器,然后使用事件检查单击的元素是否为按钮

试试这个:

const buttonsContainer = document.querySelector('.board');

buttonsContainer.addEventListener('click', handleClick);

function handleClick(event) {
    const button = event.target;
    if (button.matches('.button')) {
        console.log(button.id + " was clicked");
        buttonsContainer.removeEventListener('click', handleClick);
    }
}

关于javascript - 添加/删除事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75802740/

相关文章:

javascript - 如何创建单击按钮后打开的 Mailchimp 弹出注册表单

html - CSS:为什么 h3 会降低其父 div?

javascript - 是否可以从 onkeyup 获取 key 代码?

javascript - 反转部分图像的颜色 - HTML、CSS、JS

javascript - 绑定(bind)到复杂对象的嵌套字段并在 AngularJs 中提供默认值?

javascript - nodejs expressjs 上传图片并显示

javascript - 如何将 fullcalendar 的名称月份更改为西类牙语或任何语言

javascript - 如何检测是否以编程方式生成了 onscroll 事件?

php - 邮件 : Form Action Alternative?

.net - 解决方法 BeforeNavigate2 在 WPF .NET 中未触发