jQuery Нажмите не работает для динамически создаваемых элементов [дубликат]
этот вопрос уже есть ответ здесь:
у меня есть кусок jQuery, который проходит через каждый элемент в данном div( #container
) и делает предупреждение javascript при каждом щелчке диапазона. Это прекрасно работает, если <span>
С статический.
однако, если я использую кусок кода, как:
$(someLink).click(function(){
$("#container").html( <new html with new spans> )
});
код jQuery не срабатывает. Как ни странно, хотя
мой вопрос: есть ли причина, по которой мои события щелчка не работают для динамически создаваемых элементов? Я предполагаю, что мне придется добавить что-то в мой документ ready или heartbeat-script (который запускается каждые 100 милисекунд), чтобы подключить события??
8 ответов:
этого:
$( '#wrapper' ).on( 'click', 'a', function () { ... });
здесь
#wrapper
- это статический элемент, в который добавляются динамические ссылки.Итак, у вас есть оболочка, которая жестко закодирована в исходный код HTML:
<div id="wrapper"></div>
и вы заполняете его динамическим контентом. Идея состоит в том, чтобы делегировать события этой оболочке, а не привязывать обработчики непосредственно к динамическим элементам.
кстати, я рекомендую костяк.js - это придает структуру этому процесс:
var YourThing = Backbone.View.extend({ // the static wrapper (the root for event delegation) el: $( '#wrapper' ), // event bindings are defined here events: { 'click a': 'anchorClicked' }, // your DOM event handlers anchorClicked: function () { // handle click event } }); new YourThing; // initializing your thing
источник: этот пост
Если вы создали свои элементы динамически (с помощью javascript), то этот код не работает. Потому что. ,щелкните (), чтобы прикрепить события к уже существующим элементам. Поскольку вы динамически создаете свои элементы с помощью javascript, это не работает.
для этого вы должны использовать некоторые другие функции, которые работают на динамически созданных элементов. Это можно сделать по-разному..
ранее у нас есть .live (функция)
$('selector').live('click', function() { //your code });
но .жить() является устаревшим.Это может быть заменено другими функциями.
делегат():
используя делегат (функция) вы можете нажать на динамически генерируемые HTML-элементов.
пример:
$(document).delegate('selector', 'click', function() { //your code });
ON ():
используя on() функция вы можете нажать на динамически генерируемый HTML элементы.
пример:
$(document).on('click', 'selector', function() { // your code });
попробуйте что-то вроде
$("#container").on('click', 'someLinkSelector', function(){ $("#container").html( <new html with new spans> ) });
вам в основном нужно прикрепить ваши события из нединамической части DOM, чтобы он мог наблюдать за динамически созданными элементами.
используя
.click
будет присоединять события только к уже существующим элементам.вам нужно использовать функцию, которая отслеживает динамически создаваемые события - в старых версиях JQuery это было
.live()
, но это было заменено .on ()
я столкнулась с этой проблемой несколько дней назад - решение для меня в использовании .bind () для привязки требуемой функции к динамически созданной ссылке.
var catLink = $('<a href="#" id="' + i + '" class="lnkCat">' + category.category + '</a>'); catLink.bind("click", function(){ $.categories.getSubCategories(this); }); getSubCategories : function(obj) { //do something }
Я надеюсь, что это помогает.
вы должны добавить событие click в существующий элемент. Вы не можете добавить событие в динамические созданные элементы dom. Если вы хотите добавить к ним событие, вы должны привязать событие к существующему элементу с помощью ".на."
$('p').on('click','selector_you_dynamic_created',function(){...});
.делегат тоже должен работать.