删除内部循环javascript的事件监听器

时间:2018-03-19 00:54:03

标签: javascript html event-listener

我正在尝试删除我添加到UserDefaults.standard.set(sender.isOn, forKey: "aaaSwitch") 的事件监听器;这样听众函数只会在第一次点击时触发,并在此之后被清除。

有没有办法用纯粹的js做到这一点?

UL

4 个答案:

答案 0 :(得分:1)

只需向事件监听器添加{Once:true}选项即可。不需要为它编写代码。只需尝试这些

cardDeck[i].addEventListener('click', flip, {once:true} )

这是jsfiddle link

此参考链接。Here

PS: 将evenListener添加到每个元素的方式效率不高。如果可能,请使用委托代替冒泡用于您的用例。这是delegation

的小提琴

答案 1 :(得分:0)

您可以绑定到onclick方法,而不是使用addEventListener。因此,在执行点击后,只需将onclick设置为null

var cardDeck = document.getElementById('listDeck').getElementsByTagName('li')

for (var i = 0; i < cardDeck.length; i++) {
  cardDeck[i].onclick = flip.bind(cardDeck[i])
}

function flip(e) {
  if (e.target && e.target.nodeName == "LI") {
    var firstMove = document.getElementById(e.target.id)
    firstMove.classList.add('open', 'show')
    console.log(e.target.id + 'card was clicked');
    this.onclick = null;
  }
}

答案 2 :(得分:0)

如果您通过addEventListener添加了事件处理程序,则可以使用以下命令将其删除:

element.removeEventListener(event, function);

这允许您有选择地删除事件处理程序,而不删除任何其他可能已注册的处理程序。

function flip(e) {
    if (e.target && e.target.nodeName == "LI") {
        var firstMove = document.getElementById(e.target.id);
        firstMove.classList.add('open', 'show');
        console.log(e.target.id + 'card was clicked');
        e.currentarget.removeEventListener('click', flip);
    }
}

答案 3 :(得分:0)

如果要在调用事件监听器时删除它,可以在DOM元素上使用removeEventListener,如下所示:

 var cardDeck = document.getElementById('listDeck').getElementsByTagName('li')

    for (var i = 0; i < cardDeck.length; i++) {
      cardDeck[i].addEventListener('click', flip, false)
    }

    function flip(e) {
    //remove the event listener.
    this.removeEventListener("click",flip);
      if (e.target && e.target.nodeName == "LI") {
      var firstMove = document.getElementById(e.target.id)
      firstMove.classList.add('open', 'show')
        console.log(e.target.id + 'card was clicked');
      }
    }