【问题标题】:Loop through an array of checkboxes and insert values循环遍历复选框数组并插入值
【发布时间】:2013-04-19 22:52:24
【问题描述】:

第一次发帖,希望一切顺利:)

已经为此工作了一段时间,但基本上我正在做这样的事情:http://drupal.org/project/fancycheckboxes

我需要为我正在循环的每个复选框设置一个值是/否,现在它可以工作,但是当我更改一个时会更改所有的值。

我的 foreach 循环:

  <?php $object = new stdClass(); $i = 0; ?>
<?php foreach( $filters as $key => $value ) {
    ?>
    <tr>
        <td><label for="show_filter">Show <?php echo $object->$key = $value['filter']; ?> Filter</label></td>        
        <td><input type="checkbox" class="show_filter" <?php //if ( $row['active_filter'] === 'yes' ) { ?>checked="checked"<?php //} ?> name="dp_show_filter" value="<?php echo $object->$key = $value['active_filter']; ?>"/><?php echo $object->$key = $value['active_filter']; ?></td>
        <td><a class="button-primary" href="?page=profolio_theme&del=<?php echo $row['id'];?>">Delete</a></td>
    </tr>
    <?php
    $i++;
}

还有我的 jQuery:

jQuery(document).ready(function(e) {
    var $ = jQuery.noConflict();

        $i = 0;
        customCheckbox = $('.dp_wrap input[type="checkbox"]');
        showFilter = $('.dp_wrap input[name="dp_show_filter"]');
        values = [];

            return customCheckbox.each(function() {

                // the element
                var el = this;

                // Hide checkbox
                $(this).hide();

                // Replace element
                var rep = $('<a href="#"><span></span></a>').addClass('dp-checkbox').insertAfter(this);

                // default state
                if( $(showFilter).val() === 'yes'){
                        $(showFilter).prop('checked', true);
                        $(rep).removeClass('off').addClass('on');
                    } else {
                        $(showFilter).prop('checked', false);
                        $(rep).removeClass('on').addClass('off');
                    }
                if($(this).is(':checked') ) {
                    $(rep).addClass('on');
                } else {
                    $(rep).addClass('off');
                }

                // Click event
                $(rep).click(function(e) {

                    e.preventDefault();

                    if( $(el).is(':checked') ) {

                        values.push($(showFilter).val('no'), ++$i);

                        $(el).prop('checked', false);
                        $(rep).removeClass('on').addClass('off');
                    } else {

                        values.push($(showFilter).val('yes'), ++$i);

                        $(el).prop('checked', true);
                        $(rep).removeClass('off').addClass('on');
                    }
                });
            });
});

目前我的值以是/否的形式发布到数据库。

非常感谢任何帮助,我希望我的第一篇文章是可以接受的。

【问题讨论】:

    标签: php jquery arrays foreach checkbox


    【解决方案1】:

    它正在更改所有值,就像您为页面上创建的每个 checkbox 赋予相同的名称一样。

    你可以把你的 PHP 代码改成这样:

    <?php $object = new stdClass(); $i = 0; ?>
    <?php foreach( $filters as $key => $value ) {
    ?>
    <tr>
        <td><label for="show_filter">Show <?php echo $object->$key = $value['filter']; ?> Filter</label></td>        
        <td><input type="checkbox" class="show_filter" <?php //if ( $row['active_filter'] === 'yes' ) { ?>checked="checked"<?php //} ?> name="dp_show_filter_<?php echo $row['id'] ?>" value="<?php echo $object->$key = $value['active_filter']; ?>"/><?php echo $object->$key = $value['active_filter']; ?></td>
        <td><a class="button-primary" href="?page=profolio_theme&del=<?php echo $row['id'];?>">Delete</a></td>
    </tr>
    <?php
    $i++;
    }
    

    然后将您的 default state 更改为此并从其下方删除 if 语句:

    // default state
    if( $(this).val() === 'yes'){
        $(this).prop('checked', true);
        $(rep).removeClass('off').addClass('on');
    } else {
        $(this).prop('checked', false);
        $(rep).removeClass('on').addClass('off');
    }
    

    我很确定这将解决您所描述的问题。如果没有更完整的代码示例,很难判断。

    【讨论】:

    • 在仍然使用 $_POST['some-name'] 的同时动态更改名称的最佳方法是什么,并且在 jQuery 中针对这些输入而不是太具体,因为我在其他地方使用它?
    • 我会在复选框名称文本之后使用$key$row['id']。请记住,名称和 ID 不能以数字开头。所以像这样:name="dp_show_filter_&lt;?php echo $row['id'] ?&gt;" 然后,在您的选择代码中,您可以将$(showFilter) 替换为$(this),因为您已经在集合中的每个复选框上进行操作。就此而言,您还可以在重做您的工作的 showfilter 选择之后摆脱无关的块。我将在我的回答帖子中更新代码。
    • 确实如此,不知道为什么我没有想到这一点。我需要在 JavaScript 中做一些不同于 $('.dp_wrap input[name="dp_show_filter"]') 的事情吗?也许改用一个类?
    • 您已经选择了 .dp_wrap 元素中的所有复选框(我假设这是您想要做的)。因此,我上面建议的更改仍然应该执行您想要的。但是,是的,为了将来验证此代码(尤其是在其他地方使用),如果您要为整个集合添加唯一的类名,它将增加额外的安全性以确保您选择正确的元素集。然后将customCheckbox = $('.dp_wrap input[type="checkbox"]'); 替换为customCheckbox = $('.dp_wrap .checkbox_class_name');。你也可以去掉下面的showFilter 行。
    • 我会在 php 中尝试一下,但在 javascript 中,检查 val == yes 是否过于具体,因为我在其他不使用 yes/no 的元素上使用它跨度>
    【解决方案2】:

    您使用each 遍历您的customCheckbox 数组,但在循环内部,您访问的是一个全局数组$(showFilter)

    您是说$(showFilter[i]) 吗?

    each 回调接收i(循环中的索引)作为参数:

    return customCheckbox.each(function(i) {
        ...
    
        if( $(showFilter[i]).val() === 'yes'){ ...
    

    【讨论】:

    • 我尝试做 [] 和 [$i],同时在末尾附加 $i++,但它破坏了点击功能。
    • 如果您按照此处的建议添加了[$i],那么您将$i 变量用作.each() 函数中元素的增量器以及@ 的索引987654332@ 数组。如果您改为添加 $j 以增加您的 .each() 函数,它应该可以工作,但不是处理它的最佳方式。
    • 我编辑了我的答案。您应该使用循环索引,它作为.each 回调的参数给出。
    • 这帮助我更接近,因为我能够让它们单独更改,但现在没有任何内容发布到数据库。除了您添加的内容之外,我还添加了 var id = parseInt(this.id.replace("show_filter_", "")); var showFilter = $("show_filter_" + id);
    猜你喜欢
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2017-05-21
    相关资源
    最近更新 更多