Основная проблема будет решена, если вы удалите цикл .each()
, проверьте приведенное ниже объяснение.
Объяснение:
Поскольку вы выполняете цикл с использованием .each()
метод, в каждой итерации событие будет прикреплено, в вашем случае у вас есть два article's
, поэтому событие будет прикреплено дважды к каждому элементу, а затем будет срабатывать два раза при срабатывании touchstart
.
Тогда, поскольку вы используете toggleClass()
, первое событие добавит или удалит класс, а второе сделает противоположное и будет выглядеть так, как будто событие вообще не сработало.
$("article .hotspot").on("touchstart click", function() {
$(this).parent().find(".hotspot.visible").not(this).removeClass('visible');
$(this).toggleClass('visible');
});
.visible {
background-color: green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<article>
<div class="hotspot">1</div>
<div class="hotspot">2</div>
</article>
<br>
<article>
<div class="hotspot">1</div>
<div class="hotspot">2</div>
</article>
ПРИМЕЧАНИЕ: Чтобы проверить поведение, которое я объяснил, вы можете увидеть console.log('Event fired')
внутри события, которое было вызванодва раза по клику.
$("article").each(function() {
$("article .hotspot").on("touchstart click", function() {
$(".hotspot.visible").not(this).removeClass('visible');
$(this).toggleClass('visible');
console.log('Event fired');
})
})
.visible {
background-color: green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<article>
<div class="hotspot">1</div>
<div class="hotspot">2</div>
</article>
<article>
<div class="hotspot">1</div>
<div class="hotspot">2</div>
</article>