0

计划:

基本上我有一组服装项目存储在一个包含“item_name”“item_id”和“item_shortcode”的表中选定的数组)


我正在尝试根据从 mySQL 数据库收集的数据创建一个 javascript 对象,然后在将 div 单击到我的方法时将该数据传递给函数。

这是一个例子:

<?php 
    while($row = mysql_fetch_array($results)){ 
?>

<script>
    var item = new Object();
    item.itemName = <?php echo json_encode($row['item_name']); ?>;
</script>

<?php
            echo "<div id=\"".$row['item_name']."\" class=\"choice\" onclick=\"SetSelectedChoice(item);\">";
            //echo $row['item_name'];
            echo "</div>";
        }
    }
?>

编辑:这只是一个例子,我将用大量数据填充我的对象,而不仅仅是 item_name

问题是最后一个对象似乎分配给了 while 循环中的每个 div。

有人指出我哪里出错了吗?

4

2 回答 2

0

您在每次迭代中重新定义项目。为什么不做这样的事情:

根据编辑,您可以创建一个项目数组并将其填充到循环中:

<script type="text/javascript">
    var objects = new Array();
</script>

<?php while($row = mysql_fetch_array($results)): ?>
    <script type="text/javascript">
        var item = new Object();
        item.itemName = '<?php echo json_encode($row['item_name']); ?>';
        objects.push(item);
    </script>
    <div id="<?php echo $row['item_id']; ?>" class="choice">
            <?php echo $row['item_name']; ?>
    </div>
<?php endwhile; ?>

然后在循环之外的 js 中:

$('.choice').on('click', function(){
    SetSelectedChoice($(this).html());
});

function SetSelectedChoice(name)
{
    for(var i = 0; i < objects.length; i ++)
    {
        if(objects[i].itemName == name)
        {
            //do something
        }
    }
}

注意:我不会真的推荐这种奇怪的循环来比较名称。我只是不知道您在将名称传递给此函数时还做了什么。我将传递项目 id 或索引值并直接访问数组中的项目而不是循环。说得通?

基本上,停止使用 onclick。整个世界都更加依赖听众。其次,根本不需要创建对象。您似乎没有使用它,即使您使用了,您也没有像字符串那样在名称周围加上单引号。三、请跳出php来写html。它只是更清洁,更容易。此外,将项目的 id 分配给 id 参数。在元素的 id 中包含名称和空格真的很难看。而且您似乎并不需要它,因为您没有在示例中使用它。尽管如此,我还是把它放在那里,以防你想像$(this).attr('id')在点击监听器中一样访问它。

但是,如果我错过了重点,也许您可​​以澄清一下,我可能会更新以更好地满足您的需求

于 2012-12-06T22:08:08.617 回答
0

好吧,老实说,我不知道我是否真的得到了你,但如果我没看错,那么你只需在每次运行 while 循环时覆盖项目对象。在最后一个循环之后(输出之后),变量“item”被设置为循环的最后一个结果,所以点击任何 div 将返回“item”——循环的最后一个项目。

作为解决方案,尝试将 div 中的行名称保存为参数,例如

echo "<div id=\"".$row['item_name']."\" class=\"choice\" onclick=\"SetSelectedChoice(\'".$row['item_name']."\');\">";
于 2012-12-06T22:08:12.297 回答