Je souhaite comprendre comment fonctionne la liaison/dissociation d'événement dans les navigateurs. Plus précisément, si je supprime un élément auquel un événement est déjà lié, en utilisant par exemple jQuery: $("#anElement").remove();
, l'événement lié sera-t-il également supprimé? En d'autres termes, si je ne commence pas par l'événement unbind()
, est-ce que je crée une sorte de fuite de mémoire? Editer: Je sais qu'un gestionnaire ne sera pas déclenché à nouveau si un élément est supprimé puis ajouté, mais qu'arrive-t-il au gestionnaire? Est-ce qu'il est toujours dans le navigateur/DOM?Mécanisme de liaison d'événements dans les navigateurs
Répondre
Lorsque vous appelez .remove()
(ou .empty()
) les gestionnaires d'événements sont supprimés, vous n'êtes pas une fuite de mémoire (au moins pas de cela, ou il y a un autre bug dans le jeu).
est ici ce qui se passe (in current source):
remove: function(selector, keepData) {
for (var i = 0, elem; (elem = this[i]) != null; i++) {
if (!selector || jQuery.filter(selector, [ elem ]).length) {
if (!keepData && elem.nodeType === 1) {
jQuery.cleanData(elem.getElementsByTagName("*"));
jQuery.cleanData([ elem ]);
}
if (elem.parentNode) {
elem.parentNode.removeChild(elem);
}
}
}
return this;
}
L'important est ce bit:
jQuery.cleanData(elem.getElementsByTagName("*"));
jQuery.cleanData([ elem ]);
Cela va cleanData()
sur les éléments de l'enfant et les éléments lui-même, cela supprime les données et les événements il a $.cache
, qui nettoie la mémoire qu'ils utilisaient, et appelle interactivement jQuery.event.remove()
qui nettoie individuellement les gestionnaires d'événements.
oui, vous ne devez pas unbind
. jQuery le fait pour vous.
$(function(){
$('#featured').click(function(){
alert('test');
});
var elem;
$('#remove').click(function(){
elem = $('#featured').remove();
});
$('#attach').click(function(){
elem.appendTo('body');
});
});
Merci Reigel. Je comprends que le gestionnaire d'événements ne sera plus déclenché si vous supprimez et ajoutez à nouveau l'élément, mais la question est de savoir si le navigateur gardera toujours le gestionnaire en mémoire (et vérifie le contraire), même s'il ne correspondra jamais? Mais si jQuery détache spécifiquement des événements lorsque vous appelez remove(), cela répond également à ma question. –
ahh oui, jQuery l'a déjà fait pour vous. Si vous regardez [jQuery.js] (http://code.jquery.com/jquery-1.4.2.js) et que vous faites une recherche de «fuite de mémoire», vous pouvez voir des commentaires à ce sujet. – Reigel
- 1. Quel est le mécanisme interne utilisé par les navigateurs pour traiter/comprendre le langage HTML?
- 2. numéro de session dans les navigateurs IE
- 3. Mécanisme de réseaux P2P
- 4. Mécanisme d'injection de dépendances
- 5. mécanisme de gouvernance contenu
- 6. Mécanisme de localisation PHP
- 7. mécanisme de contrôleur codeigniter
- 8. en charge les tableaux de formulaire dans les navigateurs
- 9. HTML Analyser dans les navigateurs Web?
- 10. appendChild dans les anciens navigateurs IE
- 11. Test pour AJAX dans les navigateurs mobiles
- 12. img désaturer dans tous les navigateurs - problème
- 13. Compatibilité entre les navigateurs dans ASPNET
- 14. sites internet dans les différents navigateurs Debugging
- 15. Flotteurs gâcher dans les navigateurs Safari
- 16. "window.location.history.go (-2)" possible dans les principaux navigateurs?
- 17. seule session shairing dans tous les navigateurs
- 18. Problèmes AJAX dans les navigateurs WebKit
- 19. Mécanisme de planification Linux dans 2.6.22?
- 20. mécanisme de distribution, Rational ClearCase
- 21. Mécanisme P/Invoke pour les API wininet
- 22. Comment obtenir une compatibilité croisée entre navigateurs dans Imprimer sur la page de tous les navigateurs?
- 23. Object.watch() pour tous les navigateurs?
- 24. Différences de couleur (couleur) entre les navigateurs?
- 25. Mécanisme de modèle pour les fichiers de niveau Web
- 26. Mécanisme de fichier de réponses pour les RPM
- 27. Comment éviter de fermer les navigateurs
- 28. Problème de compatibilité sur les navigateurs Mac
- 29. Support SVG sur les navigateurs de smartphones
- 30. C# Threading Mécanisme
Ah. Donc, les événements DOIVENT être supprimés explicitement (et ne meurent pas avec l'élément), mais jQuery gère pour vous –
question rapide, est la fuite de mémoire d'interconnexion DOM-JS maintenant vieux trucs résolus dans de nouveaux navigateurs comme IE8? –