2009-08-25 3 views
0

Considérons le javascript/code jQuery:L'ajout d'un élément avec un gestionnaire d'événements à un ensemble d'éléments

jQuery("<input/>").attr("type", "button").attr("value", "Click me") 
    .click(function() 
    { 
     alert("hello"); 
    }) 
    .appendTo(".someDiv"); 

Cela crée un bouton, se fixe un gestionnaire d'événement et l'ajoute à tous les éléments avec la classe « someDiv ".

Cela fonctionne comme prévu SEULEMENT s'il n'y a qu'un seul élément avec la classe "someDiv" dans le document. S'il y en a plus, les boutons sont affichés, mais l'événement click n'est pas déclenché.

Je suis conscient que je peux utiliser la solution suivante:

jQuery(".someDiv").each(function() 
    { 
    jQuery("<input/>").attr("type", "button").attr("value", "Click me") 
     .click(function() 
     { 
      alert("hello"); 
     }) 
     .appendTo(this); 
    }); 

Ce qui fonctionne, mais est sans doute moins élégante. Je suppose que cela a quelque chose à voir avec le fait que dans le premier exemple, il n'y a qu'un élément créé et que le même élément est ajouté à tous les "someDiv", alors que dans le second exemple il y a plusieurs éléments créés, mais Je ne comprends pas pourquoi cela signifierait que le gestionnaire d'événements ne fonctionne pas dans le premier exemple.

+0

Quelle version de jQuery utilisez-vous? J'ai essayé votre exemple original et ma solution avec 1.3.2 et ils ont tous deux travaillé. – Jataro

+0

J'utilise une ancienne version (1.1.4). Je l'ai essayé avec 1.3.2 et les deux versions fonctionnent. Conclusion: bug dans l'ancienne version. (Ce que je vais devoir respecter pour des raisons de compatibilité ...) –

Répondre

0

Avez-vous essayé quelque chose comme ceci:

jQuery("<input/>").attr("type", "button").attr("value", "Click me") 
              .appendTo(".someDiv"); 
    jQuery('.someDiv input[type=button]').click(function() 
    { 
     alert("hello"); 
    }); 
+0

C'est aussi une solution réalisable, mais cela n'explique pas le "pourquoi" du problème original. :) –

+0

@Knut Arne Vedaa - Pour être honnête, je ne suis pas entièrement sûr pourquoi le premier ne fonctionne pas. Je peux * deviner * que c'est parce que le gestionnaire d'événements click ne collera pas car appendTo crée implicitement des copies de l'élément sans le gestionnaire d'événements attaché, lorsqu'il est appelé sur un sélecteur qui renvoie plusieurs éléments. – karim79

0

C'est un peu une drôle de façon de le faire. Je le câblerais avec live.

$("input[type=button]").click(function() { 
    alert("hello"); 
}); 

également pas sûr de ce que plusieurs appels attr fait pour vous:

(".someDiv").append("<input type='button' value='Click me' />"); 
+0

Plusieurs appels attr permettent d'éviter "ce genre" d'utilisation de "apostrophe". Cela me semble plus propre, probablement une chose subjective. :) –

0

Je pense que ce que vous recherchez est clone (true). Il va faire une copie de l'élément DOM et de ses gestionnaires d'événements.

jQuery("<input/>").attr("type", "button").attr("value", "Click me") 
.click(function() 
{ 
    alert("hello"); 
}) 
.clone(true) 
.appendTo(".someDiv"); 
+0

Non, cela n'a pas fonctionné, malheureusement. –

+0

Testé et fonctionne avec jQuery 1.3.2 – Jataro

Questions connexes