J'essaie de comprendre comment exécuter du code js lorsqu'un élément est supprimé de la page:
jQuery('#some-element').remove(); // remove some element from the page
/* need to figure out how to independently detect the above happened */
y a-t-il un événement adapté à cela, quelque chose comme:
jQuery('#some-element').onremoval( function() {
// do post-mortem stuff here
});
Merci.
Réponses:
Juste vérifié, il est déjà intégré dans la version actuelle de JQuery:
jQuery - v1.9.1
jQuery UI - v1.10.2
Important : il s'agit de la fonctionnalité du script d' interface utilisateur Jquery (pas JQuery), vous devez donc charger les deux scripts (jquery et jquery-ui) pour le faire fonctionner. Voici un exemple: http://jsfiddle.net/72RTz/
la source
remove
sur l'élément, il se déclenche, mais si l'élément est détruit d'une autre manière, en étant écrasé par exemple, cela ne fonctionne pas.Vous pouvez utiliser des événements spéciaux jQuery pour cela.
En toute simplicité,
Installer:
Usage:
Addendum pour répondre aux commentaires de Pierre et DesignerGuy:
Pour ne pas déclencher le rappel lors de l'appel
$('.thing').off('destroyed')
, remplacez la condition if par:if (o.handler && o.type !== 'destroyed') { ... }
la source
o.handler()
ào.handler.apply(this,arguments)
sinon l'événement et les objets de données ne sont pas passés par l'écouteur d'événement.$('.thing').unbind('destroyed')
ce qui pourrait vraiment être gênant (puisque délier signifie que nous ne voulons pas que le gestionnaire soit appelé ...)Vous pouvez vous lier à l'événement DOMNodeRemoved (partie de la spécification DOM niveau 3 WC3).
Fonctionne dans IE9, les dernières versions de Firefox et Chrome.
Exemple:
Vous pouvez également recevoir une notification lorsque des éléments sont insérés en se liant à
DOMNodeInserted
la source
e.target.className
ouif ($(e.target).hasClass('my-class')) { ...
.Il n'y a pas d'événement intégré pour supprimer des éléments, mais vous pouvez en créer un en étirant la méthode de suppression par défaut de jQuery. Notez que le rappel doit être appelé avant de le supprimer pour conserver la référence.
Remarque: certains problèmes avec cette réponse ont été soulignés par d'autres affiches.
html()
replace()
ou d'autres méthodes jQueryLa solution la plus élégante à ce problème semble être: https://stackoverflow.com/a/10172676/216941
la source
$('#some-element').bind('remove', function(ev) { if (ev.target === this) { console.log('removed!'); } });
Le crochet
.remove()
n'est pas le meilleur moyen de gérer cela, car il existe de nombreuses façons de supprimer des éléments de la page (par exemple, en utilisant.html()
,.replace()
etc.).Afin d'éviter divers risques de fuite de mémoire, jQuery tentera en interne d'appeler la fonction
jQuery.cleanData()
pour chaque élément supprimé, quelle que soit la méthode utilisée pour le supprimer.Voir cette réponse pour plus de détails: fuites de mémoire javascript
Donc, pour de meilleurs résultats, vous devez accrocher la
cleanData
fonction, ce qui est exactement ce que fait le plugin jquery.event.destroyed :http://v3.javascriptmvc.com/jquery/dist/jquery.event.destroyed.js
la source
cleanData
m'a été très utile! Merci beaucoup, Joe :)Pour ceux qui utilisent jQuery UI:
jQuery UI a substituée quelques - unes des méthodes de jQuery pour mettre en œuvre un
remove
événement qui est piloté non seulement lorsque vous supprimez explicitement l'élément donné, mais aussi si l'élément est alors retiré du DOM par toutes les méthodes jQuery auto-nettoyage (par exemplereplace
,html
etc.) . Cela vous permet essentiellement de mettre un crochet dans les mêmes événements qui se déclenchent lorsque jQuery "nettoie" les événements et les données associés à un élément DOM.John Resig a indiqué qu'il était ouvert à l'idée d'implémenter cet événement dans une future version de jQuery core, mais je ne sais pas où il en est actuellement.
la source
Seul jQuery est requis (aucune interface utilisateur jQuery requise)
( J'ai extrait cette extension du framework jQuery UI )
Fonctionne avec:
empty()
ethtml()
etremove()
Avec cette solution, vous pouvez également dissocier le gestionnaire d'événements.
Essayez! - Exemple
Démo supplémentaire - jsBin
la source
Je n'ai pas réussi à faire fonctionner cette réponse avec la dissociation (malgré la mise à jour, voir ici ), mais j'ai réussi à trouver un moyen de la contourner. La réponse a été de créer un événement spécial «destroy_proxy» qui a déclenché un événement «détruit». Vous mettez l'écouteur d'événement à la fois sur 'destroy_proxy' et sur 'destroy', puis lorsque vous souhaitez vous dissocier, vous venez de dissocier l'événement 'destroy':
Voici un violon
la source
J'aime la réponse de mtkopone en utilisant les événements spéciaux jQuery, mais notez que cela ne fonctionne pas a) lorsque les éléments sont détachés au lieu d'être supprimés ou b) lorsque certaines anciennes bibliothèques non jquery utilisent innerHTML pour détruire vos éléments
la source
detach
est surtout utilisé pour ne pas déclencher le nettoyage car l'élément est probablement prévu pour être réattaché plus tard. b) est toujours vrai et n'a pas encore de manipulation fiable, du moins depuis que les événements de mutation DOM doivent être largement mis en œuvre.Je ne suis pas sûr qu'il existe un descripteur d'événement pour cela, vous devez donc conserver une copie du DOM et comparer au DOM existant dans une sorte de boucle d'interrogation - ce qui pourrait être assez désagréable. Firebug le fait cependant - si vous inspectez le HTML et exécutez quelques modifications DOM, il met en évidence les changements en jaune dans la console Firebug pendant une courte période.
Alternativement, vous pouvez créer une fonction de suppression ...
la source
Voici comment créer un écouteur de suppression en direct jQuery :
Ou:
la source
L'événement "remove" de jQuery fonctionne correctement, sans ajout. Il pourrait être plus fiable à temps d'utiliser une astuce simple, au lieu de patcher jQuery.
Modifiez ou ajoutez simplement un attribut dans l'élément que vous êtes sur le point de supprimer du DOM. Ainsi, vous pouvez déclencher n'importe quelle fonction de mise à jour, qui ignorera simplement les éléments en voie d'être détruits, avec l'attribut "do_not_count_it".
Supposons que nous ayons un tableau avec des cellules correspondant aux prix et que vous ne deviez afficher que le dernier prix: il s'agit du sélecteur à déclencher lorsqu'une cellule de prix est supprimée (nous avons un bouton dans chaque ligne du tableau pour le faire, non affiché ici)
Et voici une fonction qui trouve le dernier prix du tableau, sans tenir compte du dernier, si c'est celui qui a été supprimé. En effet, lorsque l'événement "remove" est déclenché, et lorsque cette fonction est appelée, l'élément n'est pas encore supprimé.
Au final, la fonction update_prices () fonctionne très bien, et après cela, l'élément DOM est supprimé.
la source
se référant à la réponse @David:
Lorsque vous voulez le faire avec une autre fonction, par exemple. html () comme dans mon cas, n'oubliez pas d'ajouter return dans une nouvelle fonction:
la source
Ce.
la source
une extension de la réponse d' Adam au cas où vous auriez besoin de prévaloir par défaut, voici un contournement:
la source
Nous pouvons également utiliser DOMNodeRemoved:
la source