jQuery cliquez sur l'événement ne fonctionne pas après l'ajout de classe

Dans ma page JSP j'ai ajouté quelques liens:

<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>

Il a une fonction jQuery enregistrée pour l'événement click:

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

, Il va ajouter une classe, tabclick à <a>, qui est à l'intérieur de <li> avec id="gentab". Il fonctionne très bien. Voici mon code pour le <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>

Maintenant, j'ai un gestionnaire de clics jQuery pour ces liens

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

Pour le premier lien, cela fonctionne bien. Il alerte l'id <li>. Mais pour le second <li>, où le class="tabclick" est ajouté par le premier jQuery est pas de travail.

J'ai essayé $("a.tabclick").live("click", function(), mais le premier événement de clic de lien ne fonctionnait pas non plus.

50
demandé sur JJJ 2013-06-03 12:50:39

7 réponses

Étant donné que le class est ajouté dynamiquement, vous devez utiliser la délégation d'événements pour enregistrer le gestionnaire d'événements

$(document).on('click', "a.tabclick", function() {
    var liId = $(this).parent("li").attr("id");
    alert(liId);        
});
153
répondu Arun P Johny 2013-06-03 08:51:47

Vous devez utiliser ce qui suit:

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

Cela attachera votre événement à toutes les ancres dans l'élément #gentab , réduire la portée de la vérification de l'ensemble de l'arborescence des éléments document et augmenter l'efficacité.

14
répondu palaѕн 2013-06-03 09:02:05

.live() est obsolète.Lorsque vous souhaitez utiliser pour les éléments délégués, utilisez .sur() avec la syntaxe suivante

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

Cette syntaxe fonctionnera pour les événements délégués

.sur()

12
répondu PSR 2013-06-03 08:58:21

Basé sur @Arun P Johny voici comment vous le faites pour une entrée:

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

C'est comme ça que je l'ai eu dans jQuery:

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

Cela va se connecter sur la console: myButton1. Comme @ Arun l'a dit, vous devez ajouter l'événement dinamically, mais dans mon cas, vous n'avez pas besoin d'appeler le parent en premier.

Mettre à jour

Bien qu'il serait préférable de dire:

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

Puisque c'est la syntaxe de JQuery, même si les deux fonctionneront.

6
répondu G Jeny Ramirez 2014-04-04 00:11:05

Lors de l'événement document ready, il n'y a pas de balise avec la classe tabclick. vous devez donc lier dynamiquement l'événement click lorsque vous ajoutez une classe tabclick. veuillez ce code:

$("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');

});
2
répondu SP Singh 2013-06-03 08:58:33

Voici une autre solution, la méthode bind.

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

Cheers:)

1
répondu researcher 2015-07-22 08:10:57

Je Sais que c'est un vieux sujet...mais rien de ce qui précède ne m'a aidé. Et après avoir cherché beaucoup et tout essayé...Je suis venu avec cette.

Supprimez D'abord le code de clic du $(document).préparez la partie et mettez - la dans une section séparée. Ensuite, mettez votre code de clic dans un $(function(){......}); code.

Comme ceci:

<script>
  $(function(){
    //your click code
    $("a.tabclick").on('click',function() {
      //do something
    });
  });
</script>
0
répondu FD gi 2018-08-16 09:21:56