Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 单击一次后删除类名上的VeveEventListener_Javascript_Dom Events_Addeventlistener_Removeeventlistener - Fatal编程技术网

Javascript 单击一次后删除类名上的VeveEventListener

Javascript 单击一次后删除类名上的VeveEventListener,javascript,dom-events,addeventlistener,removeeventlistener,Javascript,Dom Events,Addeventlistener,Removeeventlistener,我正试图编写一些Javascript来获取数组中所有元素的click事件。一切正常,但我需要它只有在满足klikej()函数中的第二个条件时才可关闭。一旦触发click事件,那么具有该类的项就不应该是可单击的。我尝试过使用removeEventListener和/或使用PreventDefaults()处理它,但没有任何效果。我只需要使用普通Javascript,不需要jQuery或其他任何东西。你能帮帮我吗 poleRandomKaret.forEach(karta => {

我正试图编写一些Javascript来获取数组中所有元素的click事件。一切正常,但我需要它只有在满足
klikej()
函数中的第二个条件时才可关闭。一旦触发click事件,那么具有该类的项就不应该是可单击的。我尝试过使用
removeEventListener
和/或使用
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");
        });
    }
}
poleRandomKaret.forEach(karta=>{
document.querySelectorAll(`.${karta}`).forEach(element=>{
元素。addEventListener('单击',事件=>{
控制台日志(“klik”);
klikej(事件、要素);
});
});
});
函数klikej(事件、元素){
让kliknuteKarty=document.queryselectoral(“[dataovoce]”);
if(kliknuteKarty.length<2){
setAttribute('data-ovoce','otoceno');
}
kliknuteKarty=document.queryselectoral(“[dataovoce]”);
如果(kliknuteKarty.length==2){
kliknuteKarty[0]。类名===kliknuteKarty[1]。类名?console.log(“是”):console.log(“否”);
kliknuteKarty.forEach(元素=>{
元素。删除属性(“数据ovoce”);
});
}
}

编辑:在满足
klikej()
函数中的第二个条件之前,不应单击该项。我正在尝试用vanilla JS做记忆游戏。函数
klikej()。如果它们是两个不同的数据属性,则需要再次单击它们

您可以添加一个名为
once
的选项作为的第三个参数,使事件侦听器执行一次

element.addEventListener('click', function(e){
    console.log('clicked'); // This will be executed once.
}, {once: true});

您可以添加一个名为
once
的选项作为的第三个参数,使事件侦听器执行一次

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;

这不是对您问题的直接回答,但希望是对可能的解决方案的另一种看法-如果我理解正确,您可以在单击时执行某些操作,在未单击时执行其他操作,并且在这里您可以控制这两种情况。

如果您删除事件侦听器,并且需要再次侦听,你需要再加一次,或者用别的东西听。如果需要识别是否单击了某些内容,我会在侦听器回调中向元素添加属性,例如:

// 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;

这不是对您问题的直接回答,但希望是对可能的解决方案的另一种看法-如果我理解正确,您可以在单击时执行某些操作,在未单击时执行其他操作,并且您可以控制这两种情况。

您尝试删除的处理程序是匿名的吗?如果处理程序没有名称,您以后就无法识别它-比如当您要删除它时。Re:您的编辑。如果您想让callabck启动或不启动,这取决于JS中其他内容的真/假状态,甚至是DOM中的属性。。。这种状态可以在不同的时间间隔打开和关闭。您不想删除事件侦听器,您只需要将回调逻辑封装在一个if语句中,该语句检查您测试的对象的值。您也应该发布HTML,这样我们就可以制定一个示例解决方案。我认为您应该编辑这一行
,但我只需要它工作一次。
我认为这是误导。@JanRadosta=它已经是一个函数了。如果不是因为它是匿名的,你已经在这个地方宣布了它没有名字。那么,是的。你试图删除的处理程序是匿名的吗?如果处理程序没有名称,您以后就无法识别它-比如当您要删除它时。Re:您的编辑。如果您想让callabck启动或不启动,这取决于JS中其他内容的真/假状态,甚至是DOM中的属性。。。这种状态可以在不同的时间间隔打开和关闭。您不想删除事件侦听器,您只需要将回调逻辑封装在一个if语句中,该语句检查您测试的对象的值。您也应该发布HTML,这样我们就可以制定一个示例解决方案。我认为您应该编辑这一行
,但我只需要它工作一次。
我认为这是误导。@JanRadosta=它已经是一个函数了。如果不是因为它是匿名的,你已经在这个地方宣布了它没有名字。是的,非常感谢你的回复。我试过了,但这意味着,该项目将不再是可点击的。我需要它是可点击的,直到我在klikej()中的条件得到满足。然后它需要重置。我会编辑这篇文章。非常感谢你的回复。我试过了,但这意味着,该项目将不再是可点击的。我需要它是可点击的,直到我在klikej()中的条件得到满足。然后它需要重置。我将编辑这篇文章。这将对我有很大帮助。谢谢这对我有很大帮助。谢谢