- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面的代码应该在轮到玩家手中的每张扑克牌时添加一个事件监听器,然后在轮到其他玩家时删除事件。
它不起作用。一旦事件在第一回合初始设置,该玩家的牌就保持可点击状态。
takeTurn ( playerIndex ) {
console.log(this.name);
let handCards = document.getElementById(this.name).querySelector('.handCards');
let theCards = handCards.querySelectorAll('.handCards .card');
let that = this;
for ( let h = 0; h < theCards.length; h++ ) {
theCards[h].addEventListener("click", function onPlayCard (){
let theseCards = handCards.querySelectorAll('.handCards .card');
let discarded = that.playCard(theCards[h], theseCards, handCards);
that.gameInstance.discardPile.push(discarded);
console.log(that.gameInstance.discardPile);
for ( let e = 0; e < theseCards.length; e++) {
theseCards[e].removeEventListener("click", onPlayCard, false);
}
console.log(that.name + 'is done');
that.gameInstance.nextPlayer( playerIndex );
}, false);
}
}
我尝试了 here 中的一些想法和 here ,但都没有完全解决问题。
如有任何帮助,我们将不胜感激。我可能很快就会把头发拔掉。我以为我知道这些东西。
最佳答案
问题:
问题是您向每张卡添加了一个唯一的函数实例,但随后尝试仅使用单击的卡的函数实例将它们全部删除。这只会删除一张与添加到单击的卡中的实例实际匹配的卡。
因此,元素 0 获取处理程序 0,元素 1 获取处理程序 1,元素 2 获取处理程序 2,依此类推...
当单击一个元素(例如元素 2)时,您将迭代所有元素以删除其处理程序,但您要为被单击的元素(元素 2)提供处理程序。处理程序 2 仅用于删除元素 2,而不是其他元素。
<小时/>解决方案:
根据您当前的代码,我实际上不会给出解决方案,只是说它将涉及维护与它们绑定(bind)到的元素并行的处理程序数组。它会工作得很好,但我认为重新设计应用程序可能会更好。
<小时/>不同的方法:
IMO,重复绑定(bind)和取消绑定(bind)表明在设计应用程序时需要采取不同的方法。
您可以采用面向对象的方法,并将应用中的每种类型的项目表示为“类”(构造函数)。因此,您将使用 Game
来管理整个游戏,Card
代表纸牌的每个实例,以及 Player
来代表每个纸牌实例。玩家。
为每张卡片创建一个 Card
实例。也许还有其他特殊的,例如用于丢弃堆的Dealer
或Deck
和Discard
。 Card
可以具有表示其值和花色的属性,以及引用该卡的当前持有者的 .owner
属性。例如,.owner
可以是 Player
、Discard
堆或 Deck
。
Game
引用了所有这些对象,以便它可以协调它们。它通过将 .owner
从 Deck
更改为某个 Player
来发牌。当玩家
丢弃卡牌
时,该卡牌的.owner
将更改为Discard
。
所以基本上每个对象都维护自己的“状态”。
每个项目还可以引用其 DOM 元素,您可以将处理程序绑定(bind)到该 DOM 元素。处理程序将通过 this
引用 DOM 元素,但它还需要引用其关联实体的数据。大多数人会为每个对象创建一个单独的处理程序,并使用闭包来引用数据。我个人会使用一个鲜为人知但非常有用的功能,称为事件监听器接口(interface)。我将把这个话题留给你来研究。
具体如何设置取决于您。 游戏
是否应该将.owner
分配给卡
?还是经销商
?或者应该将Card
传递给所有者(例如Player
)并为其分配.owner
属性?或者 Card
是否应该有一个方法来接收其新所有者并将其分配给自己的 .owner
属性?由你决定。
无论如何,希望这能给你一些想法。
关于javascript - RemoveEventListener 不删除事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37758265/
我有以下代码,我在其中向文档添加了一个事件监听器,然后将其删除。 document.addEventListener("keypress", gameStart); function gameStar
我想知道是否可以在不引用应删除的事件处理函数的情况下删除事件监听器。 jquery的$().unbind('touchmove')将无法工作,因为事件监听器是使用 Javascript 的 addEv
下面的代码应该在轮到玩家手中的每张扑克牌时添加一个事件监听器,然后在轮到其他玩家时删除事件。 它不起作用。一旦事件在第一回合初始设置,该玩家的牌就保持可点击状态。 takeTurn ( playerI
这个问题已经有答案了: How to removeEventListener that is addEventListener with anonymous function? (5 个回答) 已关闭
由于某种原因,我需要在滚动页面结束时延迟点击并阻止Default一段时间。所以我写了这样的内容: // const disableClickDuringScrollHandler=(e)=> { //
我不明白为什么单击 div2 元素后 div1 元素仍然分配了事件监听器。似乎 specialFunction() 的 div 参数在初始执行后和单击 div2 后是 div1 元素,其中应该从 di
这个问题已经有答案了: Removing event listener which was added with bind (10 个回答) 已关闭 5 个月前。 我一直在研究 es6 类,并尝试设置
我知道有类似问题的问题,但我不知道如何解决该问题。 我需要解决这个问题:我在 html 文档中添加了一个 onClick 监听器,然后,在 js 中我尝试删除它,但我不能。 这是我的代码:
我正在尝试制作一款纸牌游戏。在我的游戏中,用户有义务选择一张卡(我向每张卡添加 EventListeners ,在我的 HTML 中为 ),选择后他不应该允许点击任何其他卡(我必须删除所有 Even
我添加了一个事件监听器以在用户操作后捕获 SVG 的加载。 HTML JS mySVG = document.getElementById('mySVG'); mySVG.addEventListe
这个问题在这里已经有了答案: The value of "this" within the handler using addEventListener (10 个答案) 关闭 3 年前。 我一定是
我的元素上有一个事件监听器,由于某种原因我不知道为什么没有删除。 我是这样设置的: for (i = 0; i < data[0].length; i++) { (function(i){
我想弄清楚为什么我的 removeEventListener 不起作用,我尝试了多种方法来修复它但仍然不起作用任何见解都会有所帮助。 addEventListener 按预期工作,但当我尝试删除监听器
我的 Vue 应用程序中有一个相当简单的组件。当用户打开菜单时,我将事件监听器添加到 #app 元素以检测“外部”点击。 当用户在外部单击时,它会关闭菜单并移除事件监听器。这按预期工作。问题是,当用户
我按照教程创建了 slider 效果。问题是效果在较小的屏幕上看起来不太好。我可以很容易地使用媒体查询处理样式,问题是 javascript 不是这种情况。这是我的代码: HTML:
考虑以下示例。我们有一个简单的 html 文件 Create button 和两个版本的js文件。版本一个: function create_button() { var new_
有没有办法根据变量而不是事件来删除偶数监听器?我想删除我设置的两个事件监听器,但不想删除第三方网站可能已启用的其他事件监听器。 var scrollVar = window.addEventListe
我有一些简单的代码,但目前它不会在第一次调用后删除监听器。我怎样才能做到这一点?还是我真的需要在收到通知后对 var 集添加冗余 if/else 检查? document.addEventLi
我有一个生成 HTML 元素的对象,这些元素也与该对象的数组相关联,假设我们有一个它的实例。因此,当它创建元素时,它还会将以下事件监听器分配给元素的嵌套部分(类是 uploadDelete)。 现在这
我已经尝试使用 console.log 对我的代码进行故障排除并查看它是否会运行,但它似乎只是绕过了 removeEventListeners。我让同行检查了我的代码,但不明白问题出在哪里。Javas
我是一名优秀的程序员,十分优秀!