2010-08-26 5 views
0

J'ai deux fichiers, l'un contenant un tableau en PHP qui est echo ed via json_encode, et l'autre plein de fonctions javascript pour une page Web. Une telle fonction, qui ressemble à ceci (et inachevé):JSON Array ne pas décoder avec Eval

/* 
* Function: selectVictim 
* Called from function laserOn() 
* 
* Selects a random victim from a list of victims 
* 
* @return String: victim 
*/ 
function selectVictim() 
{ 
var params = "url=queenofsheep.com/Sheep/victims.php"; 
var request = new ajaxRequest(); 

request.open("POST", "victims.php", true); 
request.setRequestHeader("Content-Type", 
          "application/x-www-form-urlencoded"); 
request.setRequestHeader("Content-Length", params.length); 
request.setRequestHeader("Connection", "close"); 

request.onreadystatechange = function() 
{ 
    if (this.readyState == 4) 
    { 
     if (this.status == 200) 
     { 
      if (this.responseText != null) 
      { 
       var vicString = this.responseText; 
       var vicArray = eval('"'+vicString+'"'); 
       //var vicArray = vicString.split(','); 
       //var numVic = Math.floor(Math.random() * (vicArray - 1)); 
       alert(vicArray); 
      } 
      else alert("Ajax error: No data received"); 
     } 
     else alert("Ajax Error: " + this.statusText); 
    } 
} 

request.send(params); 
} 

est censé prendre dans le tableau de l'autre fichier et faire les choses à ce qui sont au-delà de la portée de cette question. Malheureusement, alors que this.responseText contient un tableau codé JSON du format

var jsonArr = 
    ["1","2,","3"] 

activant la fonction ne fait rien, et eval ing this.responseText rendements « non défini. »

Qu'est-ce que je fais mal ici? Je peux fournir plus d'exemples du vrai code, du tableau actuel, peu importe, si besoin est. Ça me rend fou.

+1

Votre sortie JSON est-elle 'var jsonArr = [" 1 "," 2 "," 3 "]' ou '[" 1 "," 2 "," 3 "]'? – BoltClock

+2

L'ajout de guillemets autour du texte de la réponse indique qu'il s'agit d'une chaîne. Donc, il n'y a pas de résultat à l'évaluation. Essayez d'envelopper tout dans '()' donc: 'eval ('("' + vicString + '")'); Mais sachez que l'ajout de guillemets n'aboutira qu'à une chaîne de caractères ... Oh, et [Ne pas évaluer pour analyser JSON] (http://stackoverflow.com/questions/1843343/json-parse-vs-eval) – ircmaxell

Répondre

3

Essayez d'ajouter "(" et ")" à la fonction Eval. Voilà comment je l'ai vu faire dans le passé

var myObject = eval('(' + vicString + ')'); 
1

Utilisez request au lieu de this. this fait référence à l'objet window. Editer: si var jsonArr=[1, 2, 3]; est littéralement la réponse, vous devez utiliser eval(vicString+';jsonArr'); si vous ne pouvez pas modifier le texte de la réponse. Si vous exécutez 'eval ("var test = [1,2,3];")', vous auriez vu qu'il renvoie effectivement undefined. Mais ce n'est pas une bonne pratique dans l'utilisation de JSON.

+0

Pas nécessairement. Cela dépend de la façon dont le gestionnaire est appelé. Vous pouvez définir la valeur de 'this' si vous utilisez' fn.apply() 'ou' fn.call() '. Par exemple 'fn.call (" quelque chose ")' définit 'this' à la chaîne' "quelque chose" '. –

+0

Considérant qu'il alerte, je suppose que 'this' fait référence à l'objet request (sinon il n'aurait jamais passé les instructions' if' sauf si window a à la fois 'readyState' et' status') ... – ircmaxell

+0

Dans ce cas 'this' fait référence à' window'. Je n'ai pas dit que ça le fait toujours. – Lekensteyn

0

Définissez le type de contenu de la réponse du serveur à « application/json » et vous ne devez utiliser eval plus.
Aussi, vous seriez mieux d'utiliser un framework ajax au lieu d'utiliser vos propres fonctions ajax.