2010-11-11 4 views
0

J'ai deux fonctions: une qui crée un nouveau <textarea> quand un bouton est cliqué, et une deuxième fonction qui exécute une action lorsque le <textarea> est cliqué (ou flou, changé, etc.) Cette deuxième fonction sélectionne les éléments basés sur un nom de classe. Il semble que la deuxième fonction ne fonctionne que sur les éléments correspondants qui existaient lors du chargement de la page, mais qu'elle ne s'activera pas sur les éléments <textarea> nouvellement créés. Quelqu'un peut-il comprendre pourquoi et comment résoudre ce problème? Vous trouverez le code ci-dessous. Merci. --JakejQuery Problème: les fonctions ne fonctionneront pas sur l'élément HTML nouvellement créé

$('#add').click(function() { 
    $(this).before("<textarea class='test'></textarea>") 
}) 

$('.test').blur(function() { 
    alert('just a test') 
}) 
+3

YALQ - Encore une autre question en direct(). – Hogan

Répondre

5

Le textarea vous créez est pas autour au moment jQuery attribue l'action à des éléments marqués avec la classe .test. Vous aurez besoin de la fonction live() pour que cela fonctionne comme vous le souhaitez.

$('.test').live('blur', function() { 
    alert('just a test') 
}); 

Maintenant tout élément marqué avec .test se liera automatiquement la fonction spécifiée sur le flou, peu importe quand il est créé.

+0

Vous avez tapé votre réponse plus vite que moi: P – MLefrancois

+0

d'autres solutions doivent utiliser delegate() ou lier le gestionnaire d'événements aux éléments nouvellement créés (ce qui peut être ok si seulement ajouter un 'textarea') –

+0

@MLefrancois: Doute, je ne tapez pas terriblement rapidement. Je * fais * de temps en temps des questions avant que d'autres personnes font, rattrapant pour mon dactylographie. :) –

1

Vous pouvez lier directement:

$('#add').click(function() { 
    $(this).before("<textarea class='test'></textarea>").prev().blur(function() { 
     alert('just a test'); 
    }); 
}); 

Ou placer l'utilisation jQuery's .delegate() method pour placer un gestionnaire sur le parent de #add.

$('#add').click(function() { 
    $(this).before("<textarea class='test'></textarea>") 
}).parent().delegate('.test','blur',function() { 
    alert('just a test'); 
}); 

Cette approche est plus efficace que l'utilisation .live().

Questions connexes