2010-09-23 14 views
1

Je suis assez nouveau à Ajax. Je suis en train de mettre certaines parties spécifiques d'un fichier XML dans un div sur ma page, et les travaux suivants dans tous les navigateurs récents, sauf IE:Ajax erreur "undefined" dans IE

var xhr = false; 
//Executed to request content from the server 
function setContent(){ 
    if(window.XMLHttpRequest){ 
     xhr = new XMLHttpRequest(); 
    } else { 
     if(window.ActiveXObject){ 
      xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
    } 
    xhr.onreadystatechange = showContent; 
    xhr.open("GET", "ajax/art.xml", true); 
    xhr.send(null); 
} 
//Executed to set the appropriate text once the server has gathered the data 
function showContent(){ 
    if(xhr.readyState == 4){ 
     if(xhr.status == 200 || window.location.href.indexOf("http") == -1){ 
      var newData = xhr.responseXML.getElementsByTagName(curPage).textContent; 
     } 
     var textBox = document.getElementById("textBox"); 
     textBox.innerHTML = newData; 
    } 
} 

(La valeur de curPage est définie ailleurs dans le code et semble avoir la valeur correcte) Lorsque j'exécute ce code dans IE sur le serveur, j'obtiens le mot "undefined" dans le textBox Div au lieu du contenu saisi du document XML. Comment résoudre ça?

Merci à l'avance <> <


Merci bobince, mais cela ne semble pas fonctionner non plus.

C'est une note intéressante à propos de textContent. J'ai essayé:

if(xhr.responseXML.getElementsByTagName(allPages[curPage])[curStage].textContent != undefined){ 
    var newText = xhr.responseXML.getElementsByTagName(curPage)[curStage].textContent; 
} else { 
    var newText = xhr.responseXML.getElementsByTagName(curPage)[curStage].innerText 
    } 
} 

depuis innerText devrait fonctionner dans tous les navigateurs sauf FF et textContent devrait fonctionner dans tous les navigateurs sauf IE, mais je reçois encore « non défini » dans IE.

En outre, si j'utilise simplement innerText et oublie la compatibilité FF, je suis "indéfini" dans tous les navigateurs, pas seulement IE.

Je ne sais pas comment remédier à cette situation ...

Voici le site en direct si cela aide: www.tcmulder.com/art

(Oh, et je remarque que je utilise (curPage) [curStage], fixe le premier problème que vous avez noté)

+0

Avez-vous envisagé d'utiliser un framework JS comme [jQuery] (http://jquery.com/)? Cela va rendre votre vie beaucoup plus facile. – NullUserException

+0

J'essaie de démontrer mes compétences de codage à la main JavaScript dans ce site Web. J'ai reconstruit cette partie avec jQuery, mais je voudrais éviter cela dans le site web final.Super cadre, cependant: merci pour le pourboire. – tcmulder

+0

Y at-il une possibilité que nous puissions nettoyer cette question? Il y a des réponses aux réponses qui ont été affichées en tant que réponses complètes au lieu de commentaires ou d'ajouts à la question originale. –

Répondre

0
getElementsByTagName(curPage).textContent 

ne devrait pas fonctionner dans aucun navigateur. getElementsByTagName renvoie une liste d'éléments, pas un seul élément. Un NodeList n'a pas de propriété textContent.

Quoi qu'il en soit, IE ne prend pas en charge la propriété DOM Level 3 Core textContent. Si vous êtes sûr qu'il ya exactement un nœud de texte dans l'élément, vous pouvez lire son contenu à l'aide:

var el= xhr.responseXML.getElementsByTagName(curPage)[0]; 
var text= el.firstChild.data; 

Si l'élément peut-être vide, vous pouvez vérifier que (el.firstChild!==null); Si le texte et le contenu des éléments sont mélangés, vous devez écrire une fonction d'extraction de texte qui émule textContent.

0

Changez votre condition initiale pour vérifier d'abord l'objet MS spécifique, puis recherchez XMLHTTPRequest.

Les versions ultérieures de IE "support" XMLHttpRequest mais cela ne fonctionne pas. Si vous changez votre condition, votre code devrait fonctionner.

function setContent(){ 
    if(window.ActiveXObject){ 
     xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
    } else { 
     if(window.XMLHttpRequest){ 
      xhr = new XMLHttpRequest(); 
     } 
    } 
    xhr.onreadystatechange = showContent; 
    xhr.open("GET", "ajax/art.xml", true); 
    xhr.send(null); 
} 
+0

Merci, laissez-moi tester cela. – tcmulder

+0

Encore "indéfini", mais je laisse le "conditionnel commuté" là-bas juste pour être sûr quand je le fais fonctionner. – tcmulder

0

Merci pour votre aide; Je n'ai plus de temps sur ce site, donc je devais aller avec jQuery après tout.

function setContent(){ 
$.ajax({ 
    type: "GET", 
    url: "ajax/art.xml", 
    dataType: "xml", 
    success: function(xml){ 
     var curData = curPage + ":eq(" + [curStage] + ")"; 
     var theText = $(xml).find(curData).text(); 
     $("#textBox span").replaceWith("<span>" + theText + "</span>"); 
     ajaxReady = true; 
    } 
    }); 
}