Существует условие гонки между применением класса .open к элементу div, обновлением страницы, запросом этого элемента и тем, как пользователь ускоряет свой путь через вашу игру.Вместо того, чтобы добавлять класс .open к div, надеясь, что страница обновится достаточно быстро, а затем немедленно запросить у вас, чтобы узнать, сколько у вас открытых карт, сохраните счетчик локальных переменных.Ниже приведено небольшое изменение вашего кода
function bindcards() {
let numOfOpenCards = 0;
$(".card").click(function(e) {
++numOfOpenCards;
if(numOfOpenCards > 2)
return;
$(this).addClass("open show");
let openCards = $(".open");
let list = jQuery.makeArray(openCards);
if (numOfOpenCards >= 2 && list && list.length >= 2 && list[0].innerHTML === list[1].innerHTML) {
$(openCards).addClass("match");
}
if (numOfOpenCards >= 2) {
setTimeout(hola, 1000);
function hola() {
numOfOpenCards = 0;
let openCards = $(".open");
let list = jQuery.makeArray(openCards);
if(list) {
for(let i = 0; i < list.length; ++i)
$(list[i]).removeClass("open show");
}
}
}
});
}
Если две карты уже открыты, проверка самой последней карты.Предыдущая проверка карты должна по-прежнему завершаться и обновляться по мере необходимости.
https://codepen.io/anon/pen/NzPBrB?editors=1010
Дополнительное редактирование Если вы не хотите использовать numOfOpenCards, вы можете использовать следующее.Найдите, сколько уже открыто.Если их уже больше 2, просто выйдите.Если их уже меньше, добавьте класс, а затем снова запросите DOM.Везде, где используется numOfCards, вы можете заменить на list.length;
let openCards = $(".open");
let list = jQuery.makeArray(openCards);
if(list && list.length > 2)
return;
$(this).addClass("open show");
openCards = $(".open");
list = jQuery.makeArray(openCards);
if (list.length >= 2) {
setTimeout(hola, 1000);
function hola() {
$(list).removeClass('open show');
}
}