2010-11-16 3 views
0

cela devrait être une question simple, mais la réponse m'a échappé depuis un certain temps maintenant. Je semble avoir une erreur dans ce code, soit une faute de frappe, soit une erreur dans ma logique. Pourriez-vous clarifier mon problème?Erreur de script dans l'extrait de code jQuery/AJAX?

Voici le code:

function GetQuestion() { 
     $.ajax({ 
      type: "GET", 
      url: "questions.xml", 
      dataType: "xml", 
      success: function(xml) { 
       x = 0; 
       x = $(xml).find('Question').length; 

       var questionID = $.random(x); 

       $(xml).find('Question').each(function(){ 
        if(this.ID == questionID) { 
         var text = $(this).find('BODY').text(); 
         $('#questionBody')[0].innerHTML = text; 
        } 
       }); //close each 
      } //close success 
     });//close ajax 
    }; //close function GetQuestion 

Il est destiné à lire dans un fichier XML, recherche pour un élément spécifique avec un ID aléatoire, et branchez le contenu de BODY dans un <p> j'ai dans mon fichier HTML . Cependant, cela ne fonctionne pas comme prévu. Où ai-je fait une erreur?

Merci, Elliot Bonneville

+0

-vous * * obtenez une erreur? Qu'est-ce que '$ .random()'? –

+0

C'est une fonction personnalisée que j'ai téléchargée. Veux-tu le voir? Non, je ne reçois pas une seule erreur, même de Firebug. –

+0

quel est le problème. Vous dites que vous semblez avoir une erreur mais qu'il n'y a pas d'erreur. Alors qu'est-ce qui ne fonctionne pas comme prévu? – Hamish

Répondre

1

Ceci est juste une observation générale et pas vraiment une réponse, mais il peut aider vous à l'avenir:

//notice that this function is much easier to consume in one glance 
function GetQuestion() { 

    $.ajax({ 
     type: "GET", 
     url: "questions.xml", 
     dataType: "xml", 
     success: GetQuestionSuccess 
    });//close ajax 

}; //close function GetQuestion // <-superfluous semicolon? 



//notice that this function is much easier to consume in one glance 
function GetQuestionSuccess(xml) { 

    //let's quit querying each time we need them 
    var questions = $(xml).find('Question'); //bonus, it's a jQuery object! 

    //x = 0; // <-unnecessary assignment. It gets obliterated on the next line. 
    x = questions.length; //the count of all "Question"s found 

    var questionID = $.random(x); 

    //but wait, read my next comments below 
    questions.each(function(){ 
     if(this.ID == questionID) { 
      var text = $(this).find('BODY').text(); 
      $('#questionBody')[0].innerHTML = text; 
     } 
    }); //close each 

    //since you seem to be looking for the index questionID of all the questions, 
    //why not jump to that one instead of looping? 
    //also, if you only have one "#questionbody" in your document you can do this more "jquery"ish. 
    $('#questionBody')[0].innerHTML = questions[questionID].find('BODY').text(); 

    //only one: 
    $('#questionBody').html(questions[questionID].find('BODY').text()); 

} //close success 

ainsi préciser: \

//I shredded it down to a reasonable number of lines. Could be shorter still, albeit less readable. 
//but I think this is pretty readable. 
function GetQuestionSuccess(xml) { 

    var questions = $(xml).find('Question'); 

    var questionID = $.random(questions.length); 

    $('#questionBody').html(questions[questionID].find('BODY').text()); 

} //close success 
+0

Merci pour cette observation. Il semble que vous consacrez beaucoup plus d'efforts à cette réponse, alors je l'accepte plutôt que l'autre, puisque ni l'un ni l'autre n'aborde le problème, ce qui, à ma grande consternation, réside ailleurs. Merci pour le temps que vous y avez consacré. –

+0

@ElliotBonneville ~ Merci, je suppose. Je n'ai vraiment pas mis beaucoup de temps dedans, à peu près trois fois ce qu'il fallait pour le dactylographier, ce qui n'était pas si long à 60wpm ... Je pensais juste que vous aimeriez voir une refactorisation plus simple du code qui devrait 'ai accéléré les choses d'un léger cran (perdre le foreach fait cela). Donc vous avez trouvé le problème ailleurs? Prendre soin de partager ce qui vous causait réellement du chagrin? – jcolebrand

+0

Je suppose. Mais d'abord, réfléchissez à ceci: Chaque programmeur a au moins un total "Do'h !!" moment dans sa vie. C'était le mien; Je n'avais pas du tout le fichier XML dans le bon répertoire. Mon code a probablement bien fonctionné après tout. Le vôtre fonctionne mieux, cependant. Je vais probablement l'implémenter. –

0

En supposant que votre xml ressemble à quelque chose comme ça (puisque vous ne postez pas) (note cas sensitivty dans les balises)

<?xml version="1.0" encoding="ISO-8859-1"?> 
<questionlist> 
<Question ID='0'> 
<BODY> 
Are you 1? 
</BODY> 
</Question> 
<Question ID='1'> 
<BODY> 
Are you 2? 
</BODY> 
</Question> 
<Question ID='2'> 
<BODY> 
Are you 3? 
</BODY> 
</Question> 
<Question ID='3'> 
<BODY> 
Are you 4? 
</BODY> 
</Question> 
<Question ID='4'> 
<BODY> 
Are you 5? 
</BODY> 
</Question> 
<Question ID='5'> 
<BODY> 
Are you 6? 
</BODY> 
</Question> 
<Question ID='6'> 
<BODY> 
Are you 7? 
</BODY> 
</Question> 
</questionlist> 

Ensuite, vous pouvez utiliser cette version modifiée votre code ...

<html> 
<head> 
     <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.3.min.js"></script> 
     <script type="text/javascript"> 


function GetQuestion() { 
     $.ajax({ 
      type: "GET", 
      url: "questions.xml", 
      dataType: "xml", 
      success: function(xml) { 
       x = 0; 
       x = $(xml).find('Question').length; 
       var questionID = Math.floor(Math.random() * x); 

       $(xml).find('Question').each(function(){ 
        if($(this).attr('ID') == questionID) { 
         var text = $(this).find('BODY').text(); 
         $('#questionBody').html(text); 
        } 
       }); //close each 
      } //close success 
     });//close ajax 
    }; //close function GetQuestion 

     $(document).ready(function(){ 
     GetQuestion(); 
     }); 
     </script> 
</head> 
<body> 
<div id="questionBody"></div> 
</body> 
</html> 

J'ai changé la méthode .random $, je ne semble pas avoir cette méthode si je JS régulière, j'ai changé this.ID d'utiliser le sélecteur jquery pour vérifier l'attribut id, et j'ai changé votre ligne innerHTML pour utiliser la fonction jquery html(). Le seul problème avec le code est le fait que vous comptez sur le fait que vous aurez des questions avec les ID de n-1 entrées ...