Javascript: создание массива с переменной - PullRequest
1 голос
/ 27 октября 2010

Можно ли взять содержимое переменной и вставить его в массив следующим образом (я пытался безрезультатно):

Сначала я получаю эти значения из базы данных и использую 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'}]};

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

Ответы [ 5 ]

2 голосов
/ 27 октября 2010

Эрик прав, вам лучше использовать 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>
2 голосов
/ 27 октября 2010

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

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

var data = eval (meval);

2 голосов
/ 27 октября 2010

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

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

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

1 голос
/ 27 октября 2010

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

var data = {items: [eval(meval)]};
0 голосов
/ 27 октября 2010

Поместите элементы в скрытый ввод в следующем формате:

"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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...