通过将php数组传递给javascript函数来填充dropdown onload

时间:2014-02-21 18:43:49

标签: javascript php json

我试图将一个php数组传递给javascript函数onload,它会在下拉列表中显示js数组,但是现在我已经做了一段时间我想我需要再次弹出它

首先我使用此代码将其从一个php文件传递到另一个php文件

header("location: Rules.php?varFields=".serialize($varFields));

其次我转移到另一个变量,因为它已传递到所述的php文件

<?php
$varArray = unserialize($_GET['varFields']);
?>

第三部分是将它传递给jS功能,然后将其显示在下拉列表中

<body id="body"  onclick="cmbRuleField(\'' + <?php echo json_encode($varArray);?> + '\');"    >

这是外部javascript代码

function cmbRuleField(varArray)//ruleField 
{   
    var varDisplay = JSON.stringify(varArray);

        var sel = document.getElementById("ruleField") // find the drop down

        for (var i in varDisplay) 
        { // loop through all elements

            var opt = document.createElement("option"); // Create the new element
            opt.value = varDisplay [i]; // set the value
            opt.text = varDisplay [i]; // set the text
            sel.appendChild(opt); // add it to the select
        }

}

前两部分我已经测试了它并且它正在工作但是最后部分我不能使它工作

4 个答案:

答案 0 :(得分:1)

问题与未在此处终止的引号有关:

...
<body id="body"  onclick="cmbRuleField(\'' + <?php echo json_encode($varArray);?> + '\');"    >
...

使用json_encode创建的JSON将有很多双引号。试试这个:

<script>
var array = <?php echo json_encode($varArray);?>;
</script>
<body id="body" onclick="cmbRuleField(array);">

答案 1 :(得分:1)

我认为这部分看起来很可疑

<body id="body"  onclick="cmbRuleField(\'' + <?php echo json_encode($varArray);?> + '\');"    >

也许

<body id="body"  onclick="cmbRuleField(<?php echo json_encode($varArray);?>)">

更喜欢它。

还有一个提示,您可以在呈现的页面上看到输出,以确定写出的代码是什么样的。所以,如果你看到类似的东西:

<body id="body"  onclick="cmbRuleField('['a', 'b']')">
你知道有问题吗?您希望像这样传递本机Javascript数组

<body id="body"  onclick="cmbRuleField(['a', 'b'])">

修改

谈到聊天后,很明显OP的代码的顶部也需要调整。

header("location: Rules.php?varFields=".http_build_query($varFields));

答案 2 :(得分:1)

有一种更简单的方法。在发送到浏览器之前,将$ varArray编码为直接HTML选项。例如:

<select id="ruleField">
<?php for ($i = 0; $i < count($varArray); $i++) { ?>
        <option value="<?php= $varArray[$i].val ?>"><?php= $varArray[$i].name ?></option>
<?php } ?>       
</select>

答案 3 :(得分:0)

可能是因为你在已经是字符串的东西上调用JSON.stringify了吗?

myCars是什么?

..
for (var i in myCars)
..

可能将其重命名为varArray。

或将varDisplay重命名为varArray。

最后尝试调用JSON.parse:

function cmbRuleField(varArray)//ruleField 
{   
    var varDisplay = JSON.parse(varArray);

        var sel = document.getElementById("ruleField") // find the drop down

        for (var i in myCars) 
        { // loop through all elements

            var opt = document.createElement("option"); // Create the new element
            opt.value = varDisplay [i]; // set the value
            opt.text = varDisplay [i]; // set the text
            sel.appendChild(opt); // add it to the select
        }

}

如果这在html输出后不起作用,那么窥视可以创建一个小提琴:)