2010-10-27 5 views
1

Можно ли взять содержимое переменной и вставить его в массив, как это (я пытался без толку):Javascript: Создание массива с переменной

Сначала я получить эти значения из базы данных и с помощью формы PHP в скрытый ввод:

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

Затем соберите с JavaScript

document.getElementById("myelement").value 

Затем поместите значение

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

И тогда я пытаюсь построить данные следующим образом:

var data = {items: [meval]}; 

Если я это

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

это работает, но не начальный путь с переменной. И мне нужно собрать исходные данные.

+0

Как вы генерируете строку ('" {значение: '1', name: 'name1'}, {value: '2', name: 'name2'} "') на стороне сервера? Вы используете PHP 'json_encode()'? – Eric

ответ

2

eval() is evil! Вместо этого используйте JSON.parse().

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

Если у вас есть JQuery включен на вашем сайте, вы можете сделать $.parseJSON(), который работает лучше на старых браузерах.

+0

Я получаю неожиданный токен: ошибка ILLEGAL – clientbucket

+0

@play: Это потому, что ваш json неверен. Вы должны выводить это из своей базы данных: '{" value ":" 1 "," name ":" name1 "}, {" value ":" 2 "," name ":" name2 "}'. PHP 'json_encode()' будет делать это. – Eric

+0

@play: Позвольте мне повториться: ** Это потому, что ваш json искажен **. Еще раз: ** YOUR JSON MALFORMED **. Вы должны выводить это из своей базы данных: '{" value ":" 1 "," name ":" name1 "}, {" value ":" 2 "," name ":" name2 "}'. – Eric

1

Вы должны Eval эту переменную, чтобы превратить его содержимое в структуру данных:

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

eval дает неожиданный токен «:» error – clientbucket

2

Если вы используете строку, вы можете использовать Eval() - но это немного озорной, как он вводит безопасность & проблемы потока.

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

var data = eval (meval);

0

Поместите предметы в скрытый вход в таком формате:

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

Тогда в JS:

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

Теперь ваш массив JS выглядит следующим образом:

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

Эрик правильно, вы, как правило, лучше используете JSON, чем произвольные литералы JavaScript. В настоящее время ваш литерал недействителен JSON, потому что он не использует имена и строковые значения с двойными кавычками. Используйте json_encode, чтобы получить JSON-совместимый литеральный синтаксис.

Вы можете возвратиться к eval(), как и в других ответах, когда JSON.parse не доступен, но вам нужно будет использовать дополнительные скобки, чтобы гарантировать, что eval знает, что ведущая { означает литерал объекта, а не утверждение.

<?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> 

На самом деле JSON_HEX параметры в функции js позволяют литералы должны быть выведены таким образом, что в равной степени справедливо в атрибуте HTML или <script> блока, так что вы можете действительно пропустить скрытый вход и просто сказать:

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

Спасибо за ввод. Я решил проблему. Как-то через эхо в php что-то ускользало. – clientbucket

Смежные вопросы