Click event ne fonctionne pas sur les éléments générés dynamiquement [dupliquer]

cette question a déjà une réponse ici:

  • Événement de liaison sur de créer dynamiquement des éléments? 23 réponses
<html>
<head>
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript">

        $(document).ready(function() {

            $("button").click(function() {
                $("h2").html("<p class='test'>click me</p>")
            });   

            $(".test").click(function(){
                alert();
            });
        });

    </script>
</head>
<body>
    <h2></h2>
    <button>generate new element</button>
</body>
</html>

j'essayais de générer une nouvelle étiquette avec le nom de classe test dans le <h2> en cliquant sur le bouton. J'ai aussi défini un événement de clic associé à test . Mais l'événement n'a pas de travail.

est-ce que quelqu'un peut aider?

400
demandé sur Cᴏʀʏ 2011-07-12 06:02:22

20 réponses

la reliure click() que vous utilisez est appelée une reliure "directe" qui ne fixera le manipulateur qu'à des éléments qui existent déjà . Il ne se liera pas aux éléments créés dans le futur. Pour ce faire, vous devrez créer une reliure "déléguée" en utilisant on() .

Délégué événements ont l'avantage qu'ils peuvent traiter les événements de descendant éléments ajoutés ultérieurement au document.

Source

voici ce que vous cherchez:

var counter = 0;

$("button").click(function() {
    $("h2").append("<p class='test'>click me " + (++counter) + "</p>")
});

// With on():

$("h2").on("click", "p.test", function(){
    alert($(this).text());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<h2></h2>
<button>generate new element</button>

les travaux ci-dessus pour ceux qui utilisent jQuery version 1.7+. Si vous utilisez une ancienne version, reportez-vous à la réponse précédente ci-dessous.


Précédente Réponse :

essayez d'utiliser live() :

$("button").click(function(){
    $("h2").html("<p class='test'>click me</p>")
});   


$(".test").live('click', function(){
    alert('you clicked me!');
});

a marché pour moi. essayé avec jsFiddle.

ou il y a une nouvelle façon de le faire avec delegate() :

$("h2").delegate("p", "click", function(){
    alert('you clicked me again!');
});

Une mise à jour de jsFiddle .

594
répondu Cᴏʀʏ 2015-09-09 18:30:53

utiliser la .on() méthode Avec événements délégués

$('#staticParent').on('click', '.dynamicElement', function() {
    // Do something on an existent or future .dynamicElement
});

le .on() la méthode vous permet de déléguer n'importe quel handler d'événement désiré à:

éléments actuels ou futurs ajoutés ultérieurement au DOM.

P. S: N'utilisez pas .live() ! De jQuery 1.7+ la méthode .live() est dépréciée.

195
répondu Roko C. Buljan 2017-01-24 23:24:14

raison:

dans jQuery, cliquez sur()- attache le gestionnaire d'événements seulement si l'élément existe déjà dans le code html.

il ne considérera pas le nouvel élément qui est créé dynamiquement(élément futur) après la page chargée.

les éléments dynamiques sont créés avec l'aide de javascript ou jquery(pas en html) .

donc l'événement click ne démarre pas.

Solution:

pour surmonter cela, nous devrions utiliser la fonction on () .

délégué(),live() et () fonctions ont l'avantage, par rapport aux éléments du DOM.

on peut déclencher à la fois des éléments existants et des éléments futurs.

peut considérer les éléments qui sont tous présents dans la page entière.

délégué(),live() les fonctions sont obsolètes(Ne pas utiliser ces).

vous devez utiliser sur fonction pour déclencher l'événement sur les (futurs) éléments dynamiquement créés.

supprimer le code de $(document).prêt:

$(".test").click(function(){

  alert();

});

Modifier pour:

$(document).on('click','.test',function(){

  alert('Clicked');

});
74
répondu Prabhagaran 2018-01-18 09:36:31

Ajouter cette fonction dans votre fichier js. il fonctionnera sur chaque navigateur

$(function() {
    $(document).on("click", '#mydiv', function() {
        alert("You have just clicked on ");
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='mydiv'>Div</div>
14
répondu Abhishek 2017-08-28 17:29:37

Changement

 $(".test").click(function(){

à

 $(".test").live('click', function(){

LIVE DEMO

jQuery .live()

12
répondu qwertymk 2011-07-12 02:07:06

, Vous devez utiliser .live pour que cela fonctionne:

$(".test").live("click", function(){
   alert();
});

ou si vous utilisez jquery 1.7+ utilisez .sur :

$(".test").on("click", "p", function(){
   alert();
});
11
répondu amurra 2013-04-09 16:54:27

Essayer .live() ou .delegate()

http://api.jquery.com/live /

http://api.jquery.com/delegate /

votre élément .test a été ajouté après la méthode .click() . Live et Delegate donnent ce déclencheur d'événement aux éléments parents qui vérifient leurs enfants, de sorte que tout ce qui a été ajouté après fonctionne toujours. Je pense Live vérifiera tout le corps du document, tandis que Delegate peut être donné à un élément, donc Delegate est plus efficace.

plus d'informations:

http://www.alfajango.com/blog/the-difference-between-jquerys-bind-live-and-delegate /

7
répondu DSKrepps 2011-07-12 02:27:24

j'ai trouvé deux solutions à la documentation de jQuery:

premier: utiliser délégué sur corps ou Document

e. g:

 $("body").delegate('.test', 'click', function(){
 ...
  alert('test');
 });

pourquoi?

réponse: attachez un handler à un ou plusieurs événements pour tous les éléments qui correspondent au sélecteur, maintenant ou dans le futur, basé sur un ensemble spécifique d'éléments racine. lien: http://api.jquery.com/delegate /

Second: mettez votre fonction au " $ (document)" , en utilisant "on" et attachez-la à l'élément que vous voulez déclencher cela. Le premier paramètre est le "gestionnaire d'événement", le second: l'élément et la troisième: la fonction. Par exemple:

 $( document ).on( 'click', '.test', function () {
 ...
  alert('test');
 });

pourquoi?

Réponse: les gestionnaires d'Événements sont liés uniquement pour les éléments sélectionnés; ils doivent exister sur la page au moment de votre code fait l'appel .sur() . Pour s'assurer que les éléments sont présents et peuvent être sélectionnés, exécutez la liaison d'événement à l'intérieur d'un gestionnaire de document prêt pour les éléments qui sont dans le balisage HTML sur la page. Si du nouveau HTML est injecté dans la page, sélectionnez les éléments et attachez les gestionnaires d'événements après que le nouveau HTML est placé dans la page. Ou, utilisez événements délégués pour joindre un gestionnaire d'événements, comme décrit ci-dessous ... lien: https://api.jquery.com/on /

6
répondu user3425150 2014-03-17 00:11:47

meilleure façon d'appliquer l'événement sur le contenu généré dynamiquement en utilisant la délégation.

$(document).on("eventname","selector",function(){
    // code goes here
});

donc votre code est comme ça maintenant

$(document).on("click",".test",function(){
    // code goes here
});
5
répondu Jay Patel 2015-02-12 13:05:42
$(.surrounding_div_class).on( 'click', '.test', function () {
alert( 'WORKS!' );
});

ne fonctionnera que si le DIV avec la classe .surrounding_div_class est le parent immédiat de l'objet .essai

S'il y a un autre objet dans le div qui sera rempli, il ne fonctionnera pas.

4
répondu Nikolaus Pluta 2013-07-25 14:42:53

le problème que vous avez est que vous essayez de lier la classe" test "à l'événement avant qu'il n'y ait quoi que ce soit avec une classe" test "dans le DOM . Bien qu'il puisse sembler comme ceci est tout dynamique, ce qui se passe vraiment est JQuery fait un passage au-dessus du DOM et fils vers le haut de l'événement de clic quand la fonction ready() s'allume, qui se produit avant que vous ayez créé le "Click Me" dans votre événement de bouton.

en ajoutant l'événement de clic "test" à le" bouton " click handler il le branche vers le haut après que l'élément correct existe dans le DOM .

<script type="text/javascript">
    $(document).ready(function(){                          
        $("button").click(function(){                                  
            $("h2").html("<p class='test'>click me</p>")                          
            $(".test").click(function(){                          
                alert()                          
            });       
        });                                     
    });
</script>

utiliser live() (comme d'autres l'ont souligné) est une autre façon de faire cela, mais j'ai pensé que c'était aussi une bonne idée de souligner la petite erreur dans votre code JS. Ce que vous avez écrit n'était pas mal, il fallait juste qu'il soit correctement scopé. Comprendre comment le DOM et JS fonctionne est l'une des choses sournoises pour de nombreux développeurs pour envelopper leur tête autour.

live() est une façon plus propre de gérer cela et dans la plupart des cas est la bonne façon d'aller. Il s'agit essentiellement de regarder le DOM et de re-câblage des choses chaque fois que les éléments à l'intérieur de changer.

4
répondu Marc LaFleur 2015-07-21 05:18:21

.en direct de la fonction fonctionne très bien.

c'est pour les éléments dynamiquement ajoutés à la scène.

$('#selectAllAssetTypes').live('click', function(event){
                    alert("BUTTON CLICKED");
                    $('.assetTypeCheckBox').attr('checked', true);
                });

santé, Ankit.

3
répondu Ankit Tanna 2013-01-08 09:32:02

Jquery .on fonctionne bien mais j'ai eu quelques problèmes avec le rendu de la mise en œuvre de certaines des solutions proposées ci-dessus. Mon problème en utilisant le .on est qu'il rendait les événements différemment que la méthode .hover .

juste pour info pour toute autre personne qui pourrait aussi avoir le problème. J'ai résolu mon problème en réenregistrant l'événement de vol stationnaire pour l'Article ajouté dynamiquement:

réinscrire l'événement de vol stationnaire parce que le vol stationnaire ne fonctionne pas pour les éléments créés dynamiquement. donc à chaque fois que je crée le nouvel article/dynamic j'ajoute le code hover à nouveau. fonctionne parfaitement

$('#someID div:last').hover(
    function() {
       //...
    },
    function() {
       //...
    }
);
3
répondu user2257720 2013-04-08 13:27:55

Je ne pouvais pas obtenir live ou délégué pour travailler sur un div dans une boîte de lumière (tinybox).

j'ai utilisé setTimeout avec succès, de la manière simple suivante:

$('#displayContact').click(function() {
    TINY.box.show({html:'<form><textarea id="contactText"></textarea><div id="contactSubmit">Submit</div></form>', close:true});
    setTimeout(setContactClick, 1000);
})

function setContactClick() {
    $('#contactSubmit').click(function() {
        alert($('#contactText').val());
    })
}
3
répondu Sasha Shepherd 2015-01-07 15:04:39

vous pouvez Aussi utiliser onclick="do_something(this)" à l'intérieur de l'élément

3
répondu Daryn K. 2016-11-17 01:04:30

Une alternative et plus succincte (IMHO) est d'utiliser une fonction javascript brute qui répond à un événement on click, puis passer l'élément cible de nouveau à jQuery si vous le souhaitez. L'avantage de cette approche est que vous pouvez ajouter dynamiquement votre élément n'importe où, et le gestionnaire de clic "ne fera que fonctionner", et vous n'avez pas besoin de vous préoccuper de déléguer le contrôle aux éléments parents, et ainsi de suite.

Étape 1: mettre à jour la dynamique html pour lancer un événement onclick. Assurez-vous de passer l'objet 'event' comme argument


    $("button").click(function() {
        $("h2").html("<p class='test' onclick='test(event)'> click me </p>")
    });

Étape 2: créer la fonction de test pour répondre à l'événement de clic


    function test(e){
        alert();
    });

étape optionnelle 3: étant donné que vous utilisez jQuery, je suppose qu'il sera utile de récupérer une référence vers le bouton source


    function test(e){
        alert();

        // Get a reference to the button
        // An explanation of this line is available here
        var target = (e.target)? e.target : e.srcElement;

        // Pass the button reference to jQuery to do jQuery magic
        var $btn = $(target);

    });

3
répondu Nick Mitchell 2017-08-30 06:48:51

je travaille avec des tables qui leur ajoutent de nouveaux éléments dynamiquement, et en utilisant on (), la seule façon de le faire fonctionner pour moi est d'utiliser un parent non dynamique comme:

<table id="myTable">
    <tr>
        <td></td> // Dynamically created
        <td></td> // Dynamically created
        <td></td> // Dynamically created
    </tr>
</table>

<input id="myButton" type="button" value="Push me!">

<script>
    $('#myButton').click(function() {
        $('#myTable tr').append('<td></td>');
    });

    $('#myTable').on('click', 'td', function() {
        // Your amazing code here!
    });
</script>

C'est vraiment utile, car, pour supprimer les événements liés à () , vous pouvez utiliser off " (éteint) , et pour utiliser les événements une fois, vous pouvez utiliser () .

2
répondu Timbergus 2013-05-06 06:11:54

vous pouvez ajouter en cliquant sur les éléments dynamiquement créés. L'exemple ci-dessous. À l'aide d'un Quand prendre sûr de son fait. Dans mon exemple, je saisis un div avec la classe expand, en ajoutant un span" Cliquez pour voir plus", puis en utilisant ce span pour masquer/afficher le div original.

$.when($(".expand").before("<span class='clickActivate'>Click to see more</span>")).then(function(){
    $(".clickActivate").click(function(){
        $(this).next().toggle();
    })
});
2
répondu Daryl H 2016-04-14 19:16:36

si vous avez un lien ajouté dinamicalement à un contenant ou à la caisse:

var newLink= $("<a></a>", {
        "id": "approve-ctrl",
        "href": "#approve",
        "class": "status-ctrl",
        "data-attributes": "DATA"
    }).html("Its ok").appendTo(document.body);

vous pouvez prendre son élément JavaScript brut et y ajouter un écouteur d'événements, comme le cliquez sur :

newLink.get(0).addEventListener("click", doActionFunction);

peu importe combien de fois vous ajoutez cette nouvelle instance de lien, vous pouvez l'utiliser comme si vous utilisiez une fonction jquery click .

function doActionFunction(e) {
    e.preventDefault();
    e.stopPropagation();

    alert($(this).html());
}

donc vous recevrez un message disant

c'est ok

il a une meilleure performance que d'autres alternatives.

Extra : vous pourriez obtenir de meilleures performances en évitant jquery et en utilisant le javascript simple. Si vous utilisez IE jusqu'à la version 8, vous devez utiliser ce polyfill pour utiliser la méthode addEventListener

if (typeof Element.prototype.addEventListener === 'undefined') {
    Element.prototype.addEventListener = function (e, callback) {
      e = 'on' + e;
      return this.attachEvent(e, callback);
    };
  }
2
répondu EliuX 2017-02-03 14:26:05

utilisez " on " car le clic lie les éléments déjà présents.

pour E. g

$('test').on('click',function(){
    alert('Test');
})

ça va aider.

0
répondu Abhijit 2017-06-01 10:08:35