Ваше конкретное преобразование в .on()
не сработало должным образом, потому что вы использовали статическую форму .on()
вместо динамической формы .on()
.Вместо статической формы:
$('.alert-link').on("click", function(){
вам нужно использовать динамическую форму, подобную этой:
$(someStaticParentObject).on("click", '.alert-link', function(){
Это свяжет обработчик события с someStaticParentObject
и затем использует делегированную обработку событиядля любых дочерних событий, которые происходят с элементом, который соответствует селектору '.alert-link'
.Ваша версия немедленно связывалась с элементами '.alert-link'
, существовавшими на момент установки обработчика событий (статическая привязка), и не использовала делегированную обработку событий для обработки событий от объектов, которые еще не созданы.
См.эти предыдущие ответы дают хорошее объяснение .live()
против .on()
и почему .live()
может привести к проблемам с производительностью в некоторых случаях:
Работает ли jQuery.on () для элементов, которыедобавлен после создания обработчика событий?
Как новый метод on () в jQuery сравнивается с методом live () в производительности?
В чем разница между jQuery.bind () и jQuery.on ()?
jQuery .live () и метод .on () для добавления события click после загрузки динамического html
Почему бы не довести делегирование событий Javascript до крайности?
В двух словах:
$(".item").live('click', fn);
функциональность эквивалентна:
$(document).on('click', '.item', fn);
Два основных недостатка .live()
:
- Он немедленно оценивает селектор
".item"
, который является просто потраченными впустую циклами, потому что результат не используется вообще. .live()
жестко привязан к объекту документа.Он использует делегированную обработку событий, чтобы иметь возможность обрабатывать объекты, которые приходят и уходят, но все обработчики событий .live()
назначены объекту документа.Если их много, это может стать большим узким местом в производительности, потому что каждое событие, которое всплывает в документе, должно оцениваться по отношению к селекторам всех .live()
обработчиков событий..on()
, с другой стороны, может быть привязан не только к объекту документа, но и к предку, который намного ближе к фактическому источнику событий, и когда есть много делегированных обработчиков событий, это может быть ОЧЕНЬ более эффективнымчтобы найти события ближе, так что только события, которые находятся близко к объекту, обрабатываются с помощью селекторов .on()
, что повышает производительность.Например, описанные выше обработчики могут быть выполнены следующим образом:
$("#container").on('click', '.item', fn);
, где #container
является родителем динамических объектов .item
.