Потому что каждое событие щелчка вызывает другой .on()
для добавления дополнительных обработчиков.
Практически всегда плохая идея связывать / отвязать обработчики в их собственных событиях привязки и часто приводит к такого рода ситуации. Вместо этого вы можете положиться на функциональность .on()
для динамического выполнения при изменении классов. Это называется «делегированием события».
В основном привязать событие щелчка к общему родительскому элементу (document
часто работает, если только что-либо не останавливает распространение события). Примерно так:
$(document).on("click", ".document-short-list-item", function () {
$(this)
.removeClass("document-short-list-item")
.addClass("document-short-list-item-added");
});
$(document).on("click", ".document-short-list-item-added", function () {
$(this)
.removeClass("document-short-list-item-added")
.addClass("document-short-list-item");
});
Это прикрепит обработчик щелчка к самому документу, но при обработке этого щелчка он отфильтрует исходный элемент по аргументу селектора. Таким образом, любой исходный .document-short-list-item
вызовет первый обработчик, а любой исходящий .document-short-list-item-added
вызовет второй обработчик. Таким образом, вам нужно установить эти обработчики только один раз при загрузке страницы, и они будут выполнять внутреннюю фильтрацию по мере необходимости.
В качестве альтернативы, если этот подход может работать в вашей ситуации, вы можете использовать единственный обработчик, который будет просто переключать классы. Например:
$(document).on("click", ".document-short-list-item, .document-short-list-item-added", function () {
$(this)
.toggleClass("document-short-list-item")
.toggleClass("document-short-list-item-added");
});
Которая будет реагировать на любой исходный элемент (поскольку оба находятся в селекторе) и переключать оба класса, независимо от того, какой из них активен в данный момент.