2010-08-05 5 views
2

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

1

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.

+0

Ah. Donc, les événements DOIVENT être supprimés explicitement (et ne meurent pas avec l'élément), mais jQuery gère pour vous –

+0

question rapide, est la fuite de mémoire d'interconnexion DOM-JS maintenant vieux trucs résolus dans de nouveaux navigateurs comme IE8? –

0

oui, vous ne devez pas unbind. jQuery le fait pour vous.

here's a simple demo.

$(function(){ 
    $('#featured').click(function(){ 
     alert('test'); 
    }); 
    var elem; 
    $('#remove').click(function(){ 
     elem = $('#featured').remove();   
    }); 
    $('#attach').click(function(){ 
     elem.appendTo('body');   
    }); 
}); 
+0

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. –

+0

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

Questions connexes