【问题标题】:populate dropdown onload by passing php array to javascript function通过将php数组传递给javascript函数来填充下拉onload
【发布时间】:2014-02-22 04:58:49
【问题描述】:

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

首先我使用这段代码将它从一个 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
        }

}

前两部分我已经测试过了,它可以工作,但最后部分我不能让它工作

【问题讨论】:

    标签: javascript php json


    【解决方案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));
    

    【讨论】:

    • 只需使用我的示例兄弟中的第二行。您试图在数组周围加上单引号,这样它就不会作为数组传递给cmbRuleField,你明白我的意思吗?
    • 另外,看看浏览器中的代码,就像我在更新中建议的那样,你会明白我的意思。您需要将数组传递给cmbRuleField,而不是字符串。
    • 好的,我会尝试并回复你谢谢兄弟一会儿
    • 你传递给它的是一个serialized php 数组而不是json_encoded 数组!细看。你想传递一个 Javascript 数组。
    • 点击聊天链接。我现在在那里,准备提供帮助。
    【解决方案2】:

    问题与此处没有终止引号有关:

    ...
    <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);">
    

    【讨论】:

    • 那么当它已经在 jS 函数中时,我只需要像兄弟一样使用数组吗?
    • 我等着回复你
    • 控制台出现任何错误?你能发布你的代码吗?
    • 什么都没有显示兄弟,下拉只是什么都不显示
    【解决方案3】:

    有一个更简单的方法。在发送到浏览器之前,将 $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>
    

    【讨论】:

    • 这看起来很痛苦! json_encode 可能是正确的方向。
    • 或者更好的是,制作一个专用的 php 函数来获取任何数组并返回选项列表。你可能会经常使用它。然后你可以像 `
    • @quickshiftin:痛苦?将数组作为 JSON 字符串发送到浏览器,然后使用特定于浏览器的代码即时构建 html 元素不是很痛苦吗?用户已经在 php.ini 中构建页面的其余部分(表单、选择字段等)。 3 行额外的 PHP 与数小时的 javascript 调试听起来一点也不痛苦。
    • 是的,很痛苦。当您可以像 OP 尝试做的那样直接发送数组时,无需构建大量额外的标记。几个小时的调试,太搞笑了兄弟,笑话不断!
    【解决方案4】:

    可能是因为您在已经是字符串的东西上调用 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 输出,以便窥视者可以创建小提琴 :)

    【讨论】:

    • 我已经尝试过这样做,顺便说一下我已经将 myCars 更改为 varDisplay,以防你会注意到,兄弟还有其他想法吗?而且我没有任何 html 错误或东西,它只是在我的下拉列表中没有显示任何内容,兄弟。
    猜你喜欢
    • 2021-03-19
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2012-08-27
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    相关资源
    最近更新 更多