单击后 class 名称上的 removeEventListener
removeEventListener on class name after one click
我正在尝试编写一些 Javascript 来获取数组中具有 class 的所有元素的点击事件。一切正常,但我只需要在满足 klikej()
函数中的第二个条件之前才需要它不可点击。单击事件触发后,带有 class 的项目不应可单击。我试过使用 removeEventListener
and/or 和 PreventDefaults()
处理它,但没有任何效果。我只需要使用香草 Javascript - 不需要 jQuery 或其他任何东西。请你帮助我好吗?
poleRandomKaret.forEach(karta => {
document.querySelectorAll(`.${karta}`).forEach(element => {
element.addEventListener('click', event => {
console.log("klik");
klikej(event, element);
});
});
});
function klikej(event, element) {
let kliknuteKarty = document.querySelectorAll('[data-ovoce]');
if (kliknuteKarty.length < 2) {
element.setAttribute('data-ovoce', 'otoceno');
}
kliknuteKarty = document.querySelectorAll('[data-ovoce]');
if (kliknuteKarty.length === 2) {
kliknuteKarty[0].className === kliknuteKarty[1].className ? console.log("yes") : console.log("nope");
kliknuteKarty.forEach(element => {
element.removeAttribute("data-ovoce");
});
}
}
编辑: 在满足 klikej()
函数中的第二个条件之前,该项目不应可点击。我正在尝试使用 vanilla JS 做记忆游戏。函数 klikej()
为一个项目设置数据属性,一旦有两个项目具有相同的数据属性,它将在控制台 "yes" 中打印。如果它们是两个不同的数据属性,则它们需要再次可点击。
您可以添加一个名为 once
的选项作为 addEventListener
的第三个参数,使事件侦听器执行一次。
element.addEventListener('click', function(e){
console.log('clicked'); // This will be executed once.
}, {once: true});
如果您删除了事件侦听器,并且需要再次侦听,则需要重新添加它或使用其他侦听器。如果我需要识别是否单击了某些内容,我会在侦听器回调中将 属性 添加到元素中,例如:
// before anything else we check if it was clicked before
if (element.clicked) {
// do your magic when element was already clicked
} else {
// do different magic with not yet opened element here
}
// after you did everything needed
// set the clicked attribute to true or false (if you need "unclick" it)
element.clicked = true;
这不是您问题的直接答案,但希望是对可能解决方案的另一种看法 - 如果我对您的理解正确,您可以在点击它时做一些事情,在尚未点击它时做其他事情,在这里您可以控制对于这两种情况。
我正在尝试编写一些 Javascript 来获取数组中具有 class 的所有元素的点击事件。一切正常,但我只需要在满足 klikej()
函数中的第二个条件之前才需要它不可点击。单击事件触发后,带有 class 的项目不应可单击。我试过使用 removeEventListener
and/or 和 PreventDefaults()
处理它,但没有任何效果。我只需要使用香草 Javascript - 不需要 jQuery 或其他任何东西。请你帮助我好吗?
poleRandomKaret.forEach(karta => {
document.querySelectorAll(`.${karta}`).forEach(element => {
element.addEventListener('click', event => {
console.log("klik");
klikej(event, element);
});
});
});
function klikej(event, element) {
let kliknuteKarty = document.querySelectorAll('[data-ovoce]');
if (kliknuteKarty.length < 2) {
element.setAttribute('data-ovoce', 'otoceno');
}
kliknuteKarty = document.querySelectorAll('[data-ovoce]');
if (kliknuteKarty.length === 2) {
kliknuteKarty[0].className === kliknuteKarty[1].className ? console.log("yes") : console.log("nope");
kliknuteKarty.forEach(element => {
element.removeAttribute("data-ovoce");
});
}
}
编辑: 在满足 klikej()
函数中的第二个条件之前,该项目不应可点击。我正在尝试使用 vanilla JS 做记忆游戏。函数 klikej()
为一个项目设置数据属性,一旦有两个项目具有相同的数据属性,它将在控制台 "yes" 中打印。如果它们是两个不同的数据属性,则它们需要再次可点击。
您可以添加一个名为 once
的选项作为 addEventListener
的第三个参数,使事件侦听器执行一次。
element.addEventListener('click', function(e){
console.log('clicked'); // This will be executed once.
}, {once: true});
如果您删除了事件侦听器,并且需要再次侦听,则需要重新添加它或使用其他侦听器。如果我需要识别是否单击了某些内容,我会在侦听器回调中将 属性 添加到元素中,例如:
// before anything else we check if it was clicked before
if (element.clicked) {
// do your magic when element was already clicked
} else {
// do different magic with not yet opened element here
}
// after you did everything needed
// set the clicked attribute to true or false (if you need "unclick" it)
element.clicked = true;
这不是您问题的直接答案,但希望是对可能解决方案的另一种看法 - 如果我对您的理解正确,您可以在点击它时做一些事情,在尚未点击它时做其他事情,在这里您可以控制对于这两种情况。