2013-02-25 3 views
1

Внутри цикла jQuery я пытаюсь привязать событие click к динамически созданному тегу привязки, который содержится в элементе LI. Сам LI динамически создается внутри статического элемента UL. По какой-то причине ничто не срабатывает при нажатии на якорь. Вот упрощенная версия проблемного кода:Как связать событие click с динамически созданным тегом привязки с помощью jQuery

$.each($.MyProject.cities, function (index, city) { 
    $('<li></li>').html($("<a></a>").attr("href", "javascript:void(0)").click(function (event) { 
     console.info("Anchor clicked!"); 
     event.preventDefault(); 
     return false; 
    }).html($("<span></span>").text(city.FullName).attr("class", "autoText"))).appendTo($("#visiblecities")); 
}); 

, где visiblecities является идентификатор элемента UL и городов представляет собой коллекцию, на которой итерации цикла.

Любая идея, почему событие click не работает?

+0

http://stackoverflow.com/questions/3681425/jquery-click-not-triggering-on-links-dynamically-created-with-wrapinner –

+1

Якорь пуст, он не может быть нажат таким образом. – gdoron

+0

Извините, я удалил внутренний интервал по ошибке. Я вернул его. –

ответ

3

Используйте event delegation, чтобы создать один обработчик событий, который будет реагировать на все <a> элементы, даже если они добавлены после код выполняет:

$('#visibleCities').on('click', 'a', function(event) { 
    console.info('Anchor clicked!'); 
    event.preventDefault(); 
    return false; 
}); 

Хотя, как отметил gdoron в комментариях, ваши элементы <a> не являются текущими иметь любой контент, чтобы на самом деле он не был доступен для кликов.

+0

Я вернул внутренний элемент span, который формирует контент. Тем не менее ваш ответ выше не работает. –

+0

@YosiefKesete. Любой шанс вы могли бы предоставить демонстрацию [jsFiddle] (http://jsfiddle.net)? –

+0

http://jsfiddle.net/n2f4m/19/ –

0

использование живой метод вместо нажмите

$.each($.MyProject.cities, function (index, city) { 
     $('<li></li>').html($("<a></a>").attr("href", "javascript:void(0)").live("click",function (event) { console.info("Anchor clicked!"); event.preventDefault(); return false; })).appendTo($("#visiblecities")); 
    }); 
+1

Тысяча раз *** НЕТ! ***. Эта функция устарела в течение нескольких месяцев (начиная с версии jQuery 1.7), была полностью удалена из jQuery в версии 1.9 и привязывает обработчики событий непосредственно к документу. Он также предназначен для вызова один раз, чтобы реагировать на все элементы, не вызываемые один раз на элемент. –

1

использование .on.

$('a').on('click',function(){ 
    //code here 
}); 

Попробуйте

$('li a').on('click',function() 
{ 
    //code here 
}); 

$.each($.MyProject.cities, function (index, city) 
{ 
    $('<li></li>').html($("<a></a>").attr("href", "javascript:void(0)")).appendTo($("#visiblecities")); 
}); 
+0

Это неправильно. вы не создали событие делегата, хотя вы использовали 'on'. ** 4 ответа 4 неправильных ответа. ** – gdoron

+0

@gdoron теперь проверьте, есть ли что-то не так. –

+0

Все еще неправильно. прочитайте 'on' docs. – gdoron

Смежные вопросы