J’ai crée une jolie interface en vue d’être dynamique, il y a des boutons qui permettent d’ajouter des éléments HTML dans ma page.
Cela fonctionne bien sauf que… à ma grande surprise ces éléments sont inaccessibles au clic de souris.
J’ai donc créé un petit script pour tester ( simple ajout de liens <a>) et effectivement je ne peu cliquer sur les éléments ajouté dans le DOM.
Si je les ajoute directement dans le document.ready() alors c’est ok. Par contre via un ajout par clic que un bouton mon éléments est injecté mais ignoré aux événements (clic)
Je vous donne tout les éléments pour bien comprendre
$(document).ready(function(){
// Ajoute un lien au chargement de la page
var insert_cat = '<p><a class="link">lien numéro 2 </a></p>';
$('#zone').append(insert_cat);
// détection d'un clic sur un lien de classe .link
$(".link").on('click', function(){
console.log("clic");
});
// Ajoute un lien au clic sur boutton ADD
$("#add").on('click', function(){
var ajouter = '<p><a class="link">lien numéro x </a></p>';
$('#zone').append(ajouter);
});
}); // fin onload
Résultat page web : un lien (x) à bien été ajouter dans ma div
Inspecteur d’éléments :
Donc je répète:
- Le lien 1 présent en dur dans le code HTML est accessible au clic (normal)
- Le lien 2 injecté sans condition est accessible au clic lui aussi
- Le lien X injecté après le clique sur le bouton "ajouter" est présent mais comme ignoré, il n' est pas accessible au clic
Pourtant le JavaScript est aussi fait pour cela, injecter et cibler ces nouveaux éléments non ?
Si quelqu’un peut m’expliquer le principe ou le pourquoi du comment je lui en serait très reconnaissante
Ce comportement est tout à fait normal. Explications :
Lorsque ton code est exécuté au chargement de la page, jQuery va donc lire la ligne suivante ... :
$(".link").on('click', function() {...} );
... et à ce moment là, il va aller chercher les <p class=""link"> qu'il trouve à cet instant dans le DOM, c'est à dire celui dans la <div id="zone"> et celui que tu as créé juste avant : insert_cat.
Tous les <p class=""link"> que tu ajoutera dynamiquement après avoir attaché cet événement clic sur les .link seront ignorés, car ces nouveaux éléments n'auront, eux, aucun événement attaché.
La solution pour palier à cela est d'attacher ton événement click sur l'élément parent #zone, et de récupérer l'élément .link enfant qui a déclenché ce clic :
// détection d'un clic sur un lien de classe .link
$("#zone").on("click", ".link", function(){
console.log("clic");
});
Je venais voir s'il y avait une réponse avant d'aller au dodo et je tombe sur un nocturne
Déjà merci pour ta réponse. Je me doutais bien du comportement et mon message était plus une bouteille à la mer, vu que je pensais que ce n'était pas possible avec mon organisation.
j'ai même essayée de mettre mes fonction en dehors du document.ready() pensant pouvoir les atteindre une fois le DOM chargé et modifié, sans résultat évidemment...
pour l'API Selector je connais juste les querySelector et All() , je ne savais qu'il y avait d'autre méthodes liées.
je pense avoir comprise ton explication. je vais relire, consulter la doc que tu m'a donné et tester.
Par contre je ne pourrai pas te donner réponse avant demain soir ou Lundi (demain absente c'est dimanche ). Mais ton intervention me redonne espoirs.
En attendant je te remercie encore et te souhaite un bon Dimanche
j'ai bien comprise cette notion d'attachement au parent une fois l'insertion de nouveaux éléments après que le DOM soit chargé.
Cela va m'être utile pour la suite et cela peut sans doute expliquer certains comportements antérieurs à mes événements. Donc rien à voir avec la phase de bouillonnement (je pensais à ça aussi)
Après cette page de test, demain je vais créer mon script finale sur mon mini-projet. Si souci je reviens demander conseils.
Merci encore à toi pour ton aide et ton explication claire et détaillée
Salut jmpp désolé d'intervenir sur ce post; mais tu as lair de t'y connais en jQuery et ajax.Besoin de votre aide.Voila la problématique .
-Jai un tableau contenant une liste de produit k je voudrais ajouté en session a click. d'une image (icon-plus ).
Etape1- .clik sur l'icon-plus , je voudrai que l'aspect de limage change(icon-croix) pour avoir un rendu visuellement intéressant.Mais aussi que la classe et l'id de l'icon cliqué change
Etape2- récupérer la liste des id correspondant au icon-croix (c'est a dire ceux sur quoi on clique) dans un tableau.
Etape3- Et renvoyer ce tableau[id1,id12,id46..] au un controller qui s'occupe d'enregistrer chaque produit(id) en session.
le soucis étant quand je change l'aspect de l'icon au click et que je lui attribut une nouvelle class="panOff .Je n'arrive pas accéder dans le mon script a cette nouvelle classe. De plus je bloque aussi sur les étapes 2 et 3 .
[jQuery] HTML Insérer avec append() inaccessible
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.