2010-05-24 14 views
2

Le code suivant exécute bien dans Firefox et Chrome, mais donne une erreur:"Null" est nulle ou non une erreur d'objet dans IE javascript

'null' is null or not an object 

lorsqu'il est exécuté dans Internet Explorer.

if (xmlhttp.responseXML != null) 
    { 
    var xmlDoc = xmlhttp.responseXML.documentElement ; 
    var ResultNodes = xmlDoc.getElementsByTagName ("Result") ; <---- error here 
    if (ResultNodes != null) 
     { 

(j'aurais pensé que la ligne après celle indiquée serait plus susceptible de renvoyer l'erreur, mais le débogueur dit l'erreur en temps d'exécution est à la ligne indiquée)

Toutes les idées pourquoi?

Répondre

1

Je pensais que je voudrais juste rapport mes conclusions, maintenant que je l'ai tout de travail. Le code côté client suivant (légèrement abrégé et anonymisé) contient toutes les solutions de rechange dont j'avais besoin pour résoudre les problèmes décrits dans ce fil de discussion et fonctionne sur IE (8.0.6001), FF (3.5.9) et Chrome (5.0. 375,55 bêta). Encore à tester sous les anciennes versions de navigateurs. Un grand merci à tous ceux qui ont répondu.

Je dois aussi ajouter que je devais faire en sorte que la réponse du serveur nécessaire pour inclure:

Response.ContentType = "text/xml" ; 

pour que cela fonctionne avec IE. FF ne s'est pas occupé si le ContentType était le texte/HTML mais IE toussé.

code pour créer une demande XMLHTTP:

function GetXMLHTTPRequest() 
{ 
var activexmodes=["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"] ; //activeX versions to check for in IE 
if (window.ActiveXObject) //Test for support for ActiveXObject in IE first (as XMLHttpRequest in IE7 is broken) 
    { 
    for (var i=0; i < activexmodes.length ; i++) 
     { 
     try 
      { 
      return new ActiveXObject(activexmodes[i]) ; 
      } 
     catch (e) 
      { //suppress error 
      } 
     } 
    } 
else if (window.XMLHttpRequest) // if Mozilla, Safari etc 
    { 
    return new XMLHttpRequest() ; 
    } 
else 
    { 
    return (false) ; 
    } 
} 

code pour renvoyer la valeur de texte d'un nœud d'enregistrement:

function GetRecordElement (ARecordNode, AFieldName) 
{ 
try 
    { 
    if (ARecordNode.getElementsByTagName (AFieldName) [0].textContent != undefined) 
     { 
     return (ARecordNode.getElementsByTagName (AFieldName) [0].textContent) ; // Chrome, FF 
     } 

    if (ARecordNode.getElementsByTagName (AFieldName) [0].text != undefined) 
     { 
     return (ARecordNode.getElementsByTagName (AFieldName) [0].text) ; // IE 
     } 

    return ("unknown") ;  
    } 
catch (Exception) 
    { 
    ReportError ("(GetRecordElement): " + Exception.description) ; 
    } 
} 

code pour effectuer la requête AJAX:

function GetRecord (s) 
{ 
try 
    { 
    ReportStatus ("") ; 

    var xmlhttp = GetXMLHTTPRequest() ; 
    if (xmlhttp) 
     { 
     xmlhttp.open ("GET", "blahblah.com/AJAXget.asp?...etc", true) ; 

     if (xmlhttp.overrideMimeType) 
      { 
      xmlhttp.overrideMimeType("text/xml") ; 
      } 
     xmlhttp.setRequestHeader ("Content-Type", "text/xml; charset=\"utf-8\"") ; 

     xmlhttp.onreadystatechange = function() 
      { 
      if (xmlhttp.readyState == 4) 
       { 
       if (xmlhttp.responseXML != null) 
        { 
        var xmlDoc = xmlhttp.responseXML;     
        var ResultNodes = xmlDoc.getElementsByTagName ("Result") ; 
        if (ResultNodes != null) 
         { 
         var PayloadNode = xmlDoc.getElementsByTagName ("Payload") ; 
         if (PayloadNode != null) 
          { 
          var ResultText = ResultNodes [0].firstChild.nodeValue ; 
          if (ResultText == "OK") 
           { 
           ReportStatus (ResultText) ; 
           var RecordNode = PayloadNode [0].firstChild ; 
           if (RecordNode != null) 
            { 
            UpdateRecordDisplay (RecordNode) ; // eventually calls GetRecordElement 
            } 
           else 
            { 
            ReportError ("RecordNode is null") ; 
            } 
           } 
          else 
           { 
           ReportError ("Unknown response:" + ResultText) ; 
           }    
          }  
         else 
          { 
          ReportError ("PayloadNode is null") ; 
          } 
         }  
        else 
         { 
         ReportError ("ResultNodes is null") ; 
         } 
        } 
       else 
        { 
        ReportError ("responseXML is null") ; 
        } 
       }  
      else 
       { 
       ReportStatus ("Status=" + xmlhttp.readyState) ; 
       } 
      }  

     ReportStatus ("Requesting data ...") ; 
     xmlhttp.send (null) ; 
     } 
    else 
     { 
     ReportError ("Unable to create request") ; 
     }   
    } 
catch (err) 
    { 
    ReportError ("(GetRecord): " + err.description) ; 
    } 
} 
1

Essayez quelque chose comme ça (comme d'habitude, IE fait des choses diferently) (extrais http://msdn.microsoft.com/en-us/library/ms534370(VS.85).aspx)

if (xmlhttp.responseXML.xml) 
    var xmlDoc = xmlhttp.responseXML.xml; 
else 
    var xmlDoc = xmlhttp.responseXML; 
+0

Eh bien, ce que l'on guérit, mais IE rapporte maintenant objet requis à cette ligne: var xmlDoc = xmlhttp.responseXML.documentElement; if (xmlhttp.responseXML.xml) var xmlDoc = xmlhttp.responseXML.xml; sinon var xmlDoc = xmlhttp.responseXML; var ResultNodes = xmlDoc.getElementsByTagName ("Résultat"); si (ResultNodes! = Null) { var = PayloadNode de xmlDoc.getElementsByTagName ("Payload"); <- Erreur si (PayloadNode! = Null) code OK sur FF, Chrome – rossmcm

+0

et comment vous arrêter StackOverflow envelopper des lignes dans les commentaires? - (code avait l'air bien quand je tapais dans!) – rossmcm

+0

Oh, vous devez supprimer cette ligne: var = xmlDoc xmlhttp.responseXML.documentElement; juste avant la ligne if (xmlhttp.responseXML.xml). – jeanreis

0

Je viens de trouver une solution pour cela. Faites le type de codage us-ascii (encoding = 'us-ascii') dans le fichier xml. Cela a résolu mon problème.