2010-05-12 3 views
2

J'écris une page qui utilise beaucoup d'édition et de mise à jour in situ à l'aide de jQuery for AJAX.Réponse à l'événement click de l'élément ajouté au document après chargement de la page

Je suis venu accross un problème qui peut être mieux résumée par le flux de travail décrit ci-dessous:

  1. En cliquant sur « element1 » sur la page de résultats dans un
  2. données jQuery AJAX POST
  3. est reçu au format JSON
  4. les données reçues au format JSON
  5. les données reçues sont utilisées pour mettre à jour un « résultats » élément existant dans la page
  6. les données reçues est un formulaire HTML réel
  7. Je veux jQuery être responsable de la forme lorsque POSTer le bouton de formulaire est cliqué

Le problème se pose au point 6 ci-dessus. J'ai le code dans ma page principale qui ressemble à ceci:

$(document).ready(function(){ 
    $('img#inserted_form_btn').click(function(){ 
    $.ajax({'type': 'POST', 'url': 'www.example.com', 'success': function($data){ 
     $(data.id).html($data.frm); 
    }), 'dataType': 'json'} 
    }); 
}); 

Cependant, l'événement n'est pas déclenché. Je pense que cela est dû au fait que lorsque le document est chargé, l'élément img # inserted_form_btn n'existe pas sur la page (il est inséré dans le DOM suite à un clic sur la page (non affiché dans le code ci-dessus). garder la question courte)

Ma question est donc: comment puis-je obtenir jQuery pour être en mesure de répondre aux événements ayant lieu dans des éléments qui ont été ajoutés au DOM une fois la page chargée

+0

Notez cette question qui a une discussion sur .on, .live, .delegate et .click http://stackoverflow.com/questions/10983244/unsure-about-on-method/10983259#comment14346416_10983259 - en ajoutant cette référence pour garder le site/contexte de cette question à jour –

Répondre

10

Utilisez un gestionnaire en direct?. dépréciée depuis un certain temps, vérifier la deuxième partie de ma réponse pour de meilleures solutions!

$('img#inserted_form_btn').live('click', function() { 
    // Your click() code 
}); 

En supposant que l'image est un enfant d'un élément qui existe déjà lors de la liaison de l'événement, vous pouvez utiliser un délégué à la place:

$('#parent-element').on('click', '#inserted_form_btn', function() { 
    // Your click() code 
}); 

Si vous n'avez pas jQuery 1.7+:

$('#parent-element').delegate('#inserted_form_btn', 'click', function() { 
    // Your click() code 
}); 

Dans tous les cas, vous pouvez utiliser un délégué et utiliser $(document) au lieu de $('#parent-element') s'il n'y a pas d'élément parent approprié.

+0

+1, Et les docs : http://api.jquery.com/live/ – Joel

+0

Il est préférable d'utiliser la délégation d'événements (.delegate()). Voir les explications sur la page officielle http://api.jquery.com/live/ –

+0

Je ne pense pas que cette méthode existait au moment où j'ai posté cette réponse. – ThiefMaster

0

Vous devez soit attribuer le clic même comme un événement de processus post sur l'appel AJAX initial, à savoir

$.ajax({ url: "test.html", context: document.body, success: function(){ 
    $('img#inserted_form_btn').click(function(){ 
     $.ajax({'type: 'POST', 'url': 'www.example.com', function($data){ 
      $(data.id).html($data.frm); 
     }), 'dataType': 'json'} 
    }); 
}}); 

ou utiliser la méthode .live pour assurer l'événement est réaffecté lorsque l'élément dom est créé.

0

vous pouvez utiliser en direct() qui se lie une fonction à tous les éléments correspondant à votre sélection, même ceux créés dans l'avenir: Regardez http://api.jquery.com/live/

1

au 1.4.2 .delegate()

La documentation est ici: Delegate

0

en direct est dépréciée, utilisez .on() comme par exemple:

$('#table tbody').on('click', 'tr', function(e){ 
    var row = $(this).find('td:first').text(); 
    alert('You clicked ' + row); 
}); 
Questions connexes