Событие jQuery click не работает после добавления класса

На моей странице JSP я добавил несколько ссылок:

<a class="applicationdata" href="#" id="1">Organization Data</a>
<a class="applicationdata" href="#" id="2">Business Units</a>
<a class="applicationdata" href="#" id="6">Applications</a>
<a class="applicationdata" href="#" id="15">Data Entity</a>

Он имеет функцию jQuery, зарегистрированную для события click:

$("a.applicationdata").click(function() {
    var appid = $(this).attr("id");
    $('#gentab a').addClass("tabclick");
    $('#gentab a').attr('href', '#datacollector');
});

Он добавит класс tabclick to <a>, который находится внутри <li> с id="gentab". Он работает нормально. Вот мой код для <li>:

<li id="applndata"><a class="tabclick" href="#appdata" target="main">Application Data</a></li>
<li id="gentab"><a href="#datacollector" target="main">General</a></li>

Теперь у меня есть обработчик jQuery для этих ссылок

$("a.tabclick").click(function() {
    var liId = $(this).parent("li").attr("id");
    alert(liId);        
});

Для первой ссылки она работает нормально. Он предупреждает идентификатор <li>. Но для второго <li>, где class="tabclick" был добавлен первым jQuery, не работает.

Я пробовал $("a.tabclick").live("click", function(), но тогда первое событие щелчка ссылки также не работало.

Ответ 1

Поскольку class добавляется динамически, вам необходимо использовать делегирование событий для регистрации обработчика событий

$(document).on('click', "a.tabclick", function() {
    var liId = $(this).parent("li").attr("id");
    alert(liId);        
});

Ответ 2

Вы должны использовать следующее:

$('#gentab').on('click', 'a.tabclick', function(event) {
    event.preventDefault();
    var liId = $(this).closest("li").attr("id");
    alert(liId);  
});

Это добавит ваше событие к любым якорям в элементе #gentab, уменьшая объем проверки всего дерева элементов document и повышения эффективности.

Ответ 3

.live() устарел. Когда вы хотите использовать для делегированных элементов, используйте .on() с следующим синтаксисом

$(document).on('click', "a.tabclick", function() {

Этот синтаксис будет работать для делегированных событий

.on()

Ответ 4

Основываясь на @Arun P Johny, так вы делаете это для ввода:

<input type="button" class="btEdit" id="myButton1">

Вот как я получил его в jQuery:

$(document).on('click', "input.btEdit", function () {
    var id = this.id;
    console.log(id);
});

Это запустится на консоли: myButton1. Поскольку @Arun сказал, что вам нужно добавить событие динамически, но в моем случае вам не нужно сначала вызывать родителя.

ОБНОВЛЕНИЕ

Хотя было бы лучше сказать:

$(document).on('click', "input.btEdit", function () {
    var id = $(this).id;
    console.log(id);
});

Так как это синтаксис JQuery, хотя оба будут работать.

Ответ 5

в событии документа нет тега с классом tabclick. поэтому при добавлении класса tabclick вы должны связывать событие клика динамически. пожалуйста, этот код:

$("a.applicationdata").click(function() {
    var appid = $(this).attr("id");

   $('#gentab a').addClass("tabclick")
    .click(function() {
          var liId = $(this).parent("li").attr("id");
         alert(liId);        
      });


 $('#gentab a').attr('href', '#datacollector');

});

Ответ 6

Вот еще одно решение, метод привязки.

$(document).bind('click', ".intro", function() {
    var liId = $(this).parent("li").attr("id");
    alert(liId);        
});

Приветствия:)