2010-12-03 5 views
3

Je reçois l'erreur suivante dans IE:jQuery « « événements » est nulle ou non un objet » erreur, lors de l'utilisation vide() ou HTML()

« événements » est nulle ou non un objet - jquery-latest.js d = 1848173663, ligne 113 caractères 467

J'utilise jQuery 1.4.2, je ne suis pas en mesure de mettre à jour encore que nous sommes sur une ancienne version de jQuery UI? et avoir trop de bugs en utilisant quelque chose de plus récent que 1.4.2.

je reçois l'erreur suivante quand je lance ce morceau de code la deuxième fois :

$.post("page/view.do?undoCache=" + Math.random(), { 
    pageId: pId 
}, function(xmlContent){ 
    console.log('1');//get this one 
    $('#reloadCenterDiv').empty(); 
    console.log('2');//don't get this one unless line above is commented out, then will run til next line 
    $('#reloadCenterDiv').html(xmlContent); 
    console.log('3');//don't get this 
}); 

Je suis sûr que je ne fais rien d'autre à #reloadCenterDiv entre les appels.

recherche sur Google autour de l'erreur « des « événements » est nulle ou non un objet » J'ai trouvé ceci:

« Ça a l'air comme une référence à un événement gestionnaire est toujours là, quand le même gestionnaire est déjà parti."

Cela semble logique. D'autres idées de pourquoi et quand cette erreur se produirait?

J'ai trouvé où cela se passe, mais tous les indices pour moi se terminent là. Comment puis-je nettoyer les choses pour pouvoir appeler à nouveau empty() ou html() sur #reloadCenterDiv?

Voici le code HTML pour #reloadCenterDiv:

<div id="reloadCenterDiv" style="border:none; margin: 0; overflow:auto; overflow-y:scroll; height: auto;"></div> 
+0

pouvez-vous poster votre code HTML? – Jason

Répondre

1

Je ne sais pas, mais il semblerait que jQuery.cache est écrasé. Comme un élément DOM a (si nécessaire) un numéro de série qui correspond à jQuery.cache, lorsque vous exécutez une fonction comme .empty(), jQuery suppose que les données connexes existent, recherche les données de cet élément et les supprime.

Au lieu de votre première connexion, faites ceci:

console.log(jQuery.cache); 

Et voir ce que cela donne. Je parie que quelque chose l'écrase. Peut-être que vous chargez jQuery deux fois?

Here's an example qui supprime intentionnellement jQuery.cache. Cela donne une erreur similaire.


EDIT:

Résumé des commentaires ci-dessous. Pendant .empty() (ou réellement cleanData()) jQuery saisit l'expando de tous les éléments descendants afin de supprimer les données associées.

Le problème est que lorsque jQuery le fait, il suppose que les données ont été trouvées avec succès.Dans ce cas, les données sont en quelque sorte dissociées de l'élément, donc l'extraction des données à l'aide de la valeur de l'expando renvoie undefined.

Parce que jQuery ne pas (ou n'a pas 1.4.2) vérifier que les données ont été trouvées, sa tentative d'accéder à la propriété events sur les données provoque une erreur, parce qu'encore une fois data est undefined.

Les versions mises à jour de jQuery le corrigent avec if (data && data.events) {, ce qui vérifie qu'il existe un objet pour lequel demander sa propriété events.

+0

Les 1er et 2ème appels renvoient tous les deux [objet objet] dans les outils de développement IE. Comment est-ce que je vois ce qu'est l'objet? Est-ce que vérifier cela dans Firebug fera du bien? Je ne reçois pas l'erreur dans FireFox. – UpHelix

+0

@Dale - Oui, les outils de Firebug ou de Google Chrome devraient vous permettre d'illustrer le contenu de l'objet. On dirait que vous avez un objet là-bas. Essayez de faire 'console.log (jQuery.cache [1])'. Y at-il une chance qu'une autre version de jQuery soit chargée quelque part? Peut-être via un appel AJAX? Je crois que cela pourrait remplacer le cache avec une nouvelle version. – user113716

+0

@patrick dw - Non, une seule instance de jQuery est chargée. Juste vérifié maintenant pour faire plus sûr. – UpHelix

0

Si vous ne pouvez pas mettre à jour votre jQuery, vous pouvez définir le code HTML à la place:

$("#divid").html(""); 

Ce fait essentiellement la même chose.

Questions connexes