2008-10-09 9 views
2

Les oeuvres suivantes dans Firefox, mais des ruptures dans IE7 & 8:sélecteurs jQuery CSS dans IE

$("#my-first-div, #my-second-div").hide(); 

donc je dois faire:

$("#my-first-div").hide(); 
$("#my-second-div").hide(); 

Est-ce normal?

EDIT: ok, mon code réel de la vie réelle est la suivante:

$("#charges-gsm,#charges-gsm-faq,#charges-gsm-prices").html(html); 

et mon erreur est ce

(IE8): Message: 'nodeName' is null or not an object 
    Line: 19 Char: 150 Code: 0 
    URI: http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js 
+0

cela fonctionne pour moi, à la fois sur IE7 et Firefox – Nico

Répondre

2

L'emplacement que vous spécifiez états:

Message: 'nodeName' is null or not an object 
    Line: 19 Char: 150 Code: 0 
    URI: http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js 

Ce morceau particulier de jquery est:

nodeName:function(elem,name){ 
    return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase(); 
} 

qui est lui-même une fermeture créée pour l'appel à jQuery.extend(). Donc, je voudrais demander, si vous faites un "View source" ou son équivalent IE, y at-il d'autres occurrences de la chaîne "nodeName" qui pourrait interférer avec le jQuery.

Pouvez-vous également tester ce qui suit en créant un fichier xx.html et en l'ouvrant dans IE7/8? Cela fonctionne très bien sous Firefox 3 dans Ubuntu, avec ou sans les espaces qui suivent les virgules dans le sélecteur.

<html> 
    <head> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script> 
    <script type="text/javascript"> 
    $(document).ready(function(){ 
     $("a").click(function(event){ 
     $("#charges-gsm,#charges-gsm-faq,#charges-gsm-prices").html("xx") 
     event.preventDefault(); 
     }); 
    }); 
    </script> 
    </head> 
    <body> 
    <a href="http://jquery.com/">jQuery</a> 
    <hr> 
    <div id="charges-gsm">CHARGES-GSM</div> 
    <div id="charges-gsm-faq">CHARGES-GSM-FAQ</div> 
    <div id="charges-gsm-prices">CHARGES-GSM-PRICES</div> 
    </body> 
</html> 
+0

Merci pour ce Pax. Votre exemple fonctionne bien. Je vais faire un peu de débogage et vous faire savoir quel est mon problème. Au moins, je sais maintenant que c'est ma faute;) Merci beaucoup! –

+0

Ce n'est jamais la faute des développeurs :-), plus probablement une interaction entre jQuery et une autre chose AJAX (comme les API Google). C'est pourquoi j'ai utilisé l'exemple pour le réduire à jQuery ou non-jQuery. – paxdiablo

1

Hmm, je ne peux pas sembler reproduire le problème dans IE7 (les deux formes fonctionnent bien pour moi). Comment ça casse? Ne cache-t-il pas non plus, ou cache-t-il seulement le premier?

+0

ok, mon vrai code de la vie réelle est la suivante: $ ("# charges-GSM, # charges-GSM-faq, # charges-GMT-prix"). html (html); et mon erreur est-ce (IE8): Message: 'nodeName' est nulle ou non un objet ligne: 19 Char: 150 code: 0 URI: http://ajax.googleapis.com/ajax /libs/jquery/1.2.6/jquery.min.js –

0

Devrait fonctionner selon le documentation. Vous avez besoin de supprimer le caractère espace après la virgule.

0

Par chance, l'un de vos éléments est-il imbriqué dans l'autre?

-à-dire:

<div id="foo"> 
    <div id="bar"> 
    <div id="baz"> 
    </div> 
</div> 

Si oui, vous pouvez être confronté à un problème de pointeur, où IE peut avoir libéré la barre avant de vous essayer de comprendre que son un div. Le comportement de

$("#foo,#bar,#baz").html("xx"); 

Dans ce secenario est:

  1. Remplacer #foo avec xx
  2. Remplacer #bar avec xx
  3. Remplacer #baz avec xx

Cependant, si aux phases 2 & 3, #bar et #baz n'existent plus, vous allez vous amuser un peu.(il n'est pas important que xx contienne une copie de #bar et #baz, ils seront probablement des objets différents, et les objets initiaux que vous remplacez ont déjà été capturés, ne sont plus dans le DOM: /)

Vous pouvez éventuellement supprimer (oui, Gah, mauvaise idée) cette erreur en encapsulant la procédure dans un try/catch

try { 
    $("#foo,#bar,#baz").html("xx"); 
} 
catch(e) 
{ 
    /* DO NOTHING D: */ 
} 

Mais ceci est votre dernier recours, juste après avoir obtenu une sorte de JS Débogueur liant IE et traçant l'erreur à son noyau.