2010-10-27 8 views
1

Est-il possible de prendre le contenu d'une variable et le coller dans un tableau comme si (je l'ai essayé en vain):Javascript: Construire un tableau avec une variable

D'abord je reçois ces valeurs d'un base de données et en utilisant le formulaire php dans une entrée cachée:

{value: '1', name: 'name1'},{value: '2', name: 'name2'} 

percevraient avec javascript

document.getElementById("myelement").value 

Ensuite, mettre la valeur

var meval = document.getElementById("myelement").value; 

Et puis j'essaie de construire les données comme ceci:

var data = {items: [meval]}; 

Si je fais

var data = {items: [{value: '1', name: 'name1'},{value: '2', name: 'name2'}]}; 

cela fonctionne, mais pas la façon initiale avec la variable. Et je dois construire les données d'origine comme ça.

+0

Comment générez-vous la chaîne ('" {valeur: '1', nom: 'nom1'}, {valeur: '2', nom: 'nom2'} "' ') côté serveur? Utilisez-vous 'json_encode()' de PHP? – Eric

Répondre

2

eval() est diabolique! Utilisez JSON.parse() à la place.

var data = {items: JSON.parse('['+meval+']')}; 

Si vous avez jQuery inclus sur votre site, vous pouvez faire $.parseJSON() qui fonctionne mieux sur les navigateurs plus anciens.

+0

Je reçois un jeton inattendu: erreur ILLEGAL – clientbucket

+0

@play: C'est parce que votre json est mal formé. Vous devriez le sortir de votre base de données: '{" value ":" 1 "," name ":" name1 "}, {" value ":" 2 "," name ":" nom2 "}'. Le 'json_encode()' de PHP fera cela. – Eric

+0

@play: Laissez-moi me répéter: ** C'est parce que votre json est mal formé **. Encore une fois: ** VOTRE JSON EST MALFORMÉ **. Vous devriez le sortir de votre base de données: '{" value ":" 1 "," name ":" name1 "}, {" value ":" 2 "," name ":" nom2 "}'. – Eric

1

Vous devez eval cette variable pour transformer son contenu dans la structure de données:

var data = {items: [eval(meval)]}; 
+0

eval donne un jeton inattendu ":" erreur – clientbucket

2

Si votre aide d'une chaîne, vous pouvez utiliser eval() - mais il est un peu méchant, car il introduit la sécurité & problèmes d'écoulement. Var meval = "[{valeur: '1', nom: 'nom1'}, {valeur: '2', nom: 'nom2'}]";

var données = eval (meval);

0

Mettre les éléments dans une entrée cachée dans ce format:

"name1"."|"."name2"."|"."name3"... and so on 

Puis, en JS:

var list = document.getElementById("yourelement").value; 
var arrayOfStuff = list.split("|"); 

Maintenant votre tableau JS ressemble à ceci:

array() { 
    [0] => "Name1" 
    [1] => "Name2" 
    [2] => "Name3" 
    ... and so on 
} 
2

Eric est à droite, vous êtes généralement mieux d'utiliser JSON que des littéraux JavaScript arbitraires. Actuellement, votre littéral n'est pas un JSON valide car il n'utilise pas de noms de propriété entre guillemets et de valeurs de chaîne. Utilisez json_encode pour obtenir une syntaxe littérale compatible avec JSON.

Vous pouvez revenir à eval() comme dans d'autres réponses lorsque JSON.parse ne sont pas disponibles, mais vous aurez besoin d'utiliser des crochets supplémentaires pour faire en sorte que eval sait que le premier { signifie un littéral objet et non une déclaration.

<?php 
    function js($s) { // shortcut to save some typing 
     echo json_encode($s, JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_QUOT|JSON_HEX_APOS); 
    } 

    $data= array(name=>$row['name'], value=>$row['value']); 
?> 
<input type="hidden" id="data" value="<?php js($data); ?>"/> 

<script type="text/javascript"> 
    var json= document.getElementById('data').value; 
    var data= 'JSON' in window? JSON.parse(json) : eval('('+json+')'); 
</script> 

En fait, les JSON_HEX options dans la fonction js permettent littéraux d'être sortie d'une manière qui est tout aussi valable dans un attribut HTML ou un bloc <script>, donc vous pouvez en effet omettre l'entrée cachée et juste dire:

<script type="text/javascript"> 
    var data= <?php js($data); ?>; 
</script> 
+0

Merci pour l'entrée. J'ai résolu le problème. D'une certaine manière, à travers l'écho de php, quelque chose s'échappait. – clientbucket

Questions connexes