【问题标题】:Checkbox change event - jquery 1.10.12复选框更改事件 - jquery 1.10.12
【发布时间】:2014-01-06 15:05:29
【问题描述】:

我在使用复选框搜索过滤器时遇到问题。

我使用的是 jquery 1.10.2,并且在在线测试其他解决方案时结果好坏参半,但我无法使其正常工作。

场景:

我有如下分类表:
1 级 - 主猫
2级 - 子猫
3级 - 子猫
类别选项使用 CSS 下拉菜单与复选框一起显示。

每个类别复选框都有两个jquery函数如下:

函数1 -:slideUp/Down 结果显示在 ul/li 页面上。

功能 2 -:1 级和 2 级复选框必须分别选中/取消选中 2 级和 3 级复选框

上滑/下滑功能

<script type="text/javascript">
    $(document).ready(function () {
    $('.results > li').hide();

        $('div.tags').find('input:checkbox').on('change', function () {
            $('.results > li').slideUp(400);
            $('div.tags').find('input:checked').each(function () {
                $('.results > li.' + $(this).attr('rel')).slideDown(400);
            });
        });
    });  
</script>

由于类别众多,我选择使用 php 来编写
check/uncheck 函数:

<script type="text/javascript">
<?php
$catdata = mysql_query("SELECT * FROM categories order by catname;");
    while ($catdatarow = mysql_fetch_array($catdata)) {
        echo("$(document).ready(function(){");
            echo("$(\"#cat" . $catdatarow['catid'] . "\").on('change', function(){");
                echo("$(\"." . $catdatarow['catid'] . "\").prop(\"checked\",$(\"#cat" . $catdatarow['catid'] . "\").prop(\"checked\"))");
            echo("})");
        echo("});");
    }
?>
</script>

<script type="text/javascript">
<?php
$subcatdata = mysql_query("SELECT * FROM subcategories order by subcatname;");
    while ($subcatdatarow = mysql_fetch_array($subcatdata)) {
        echo("$(document).ready(function(){");
            echo("$(\"#subcat" . $subcatdatarow['subcatid'] . "\").on('change', function(){");
                echo("$(\"." . $subcatdatarow['subcatid'] . "\").prop(\"checked\",$(\"#subcat" . $subcatdatarow['subcatid'] . "\").prop(\"checked\"))");
            echo("})");
        echo("});");
    }
?>
</script>

问题:
虽然所有基本功能都可以正常工作,但我的问题如下:

如果我点击 2 级猫复选框,则所有 3 级猫复选框都会被选中,如果我点击 1 级猫复选框,则所有 2 级猫复选框都会被选中,但根据我的理解,点击 1 级时应该根据“更改”事件检查相同选择的第 2 级和第 3 级复选框,但这不会发生。

这个问题也适用于 slideUp/Down 函数,因为 li 项目与 3 级 cat 复选框相关联。手动单击 3 级复选框将导致 li 项目向上滑动/向下滑动,并且假设在给定更改事件的情况下,当单击检查所有 3 级 cat 复选框的 2 级 cat 复选框时,将发生 li slideUp/Down因为 3 级 cat 复选框现在已更改,但这也不会发生。

以下是上滑/下滑的 li 结果示例:

<ul class="results">
    <li class="1002">
    <table>
        <tr>
            <td style="padding:15px;"><img src="images/image.jpg" alt="" width="60" height="80" border="0" /></td>
            <td style="padding:15px;"><h4>Result A</h4>Description</td>
        </tr>
    </table>
    </li>
</ul>

现在我知道我一定有问题或遗漏了什么,请您指出正确的方向吗?

谢谢。

类别的 HTML:

<ul>
    <li>
        <input type="checkbox" rel="1020" id="cat1020" />Level 1 Cat 1
            <ul>
                <li>
                    <input type="checkbox" rel="2465" id="subcat2465" class="1020" />Level 2 Cat 1
                </li>
                <li>
                    <input type="checkbox" rel="2452" id="subcat2452" class="1020" />Level 2 Cat 2
                </li>
                <li>
                    <input type="checkbox" rel="2464" id="subcat2464" class="1020" />Level 2 Cat 3
                </li>
                <li>
                    <input type="checkbox" rel="2463" id="subcat2463" class="1020" />Level 2 Cat 4
                </li>
            </ul>
    </li>
    <li>
        <input type="checkbox" rel="1015" id="cat1015" />Level 1 Cat 2
            <ul>
                <li>
                    <input type="checkbox" rel="2346" id="subcat2346" class="1015" />Level 2 Cat 5
                </li>
                <li>
                    <input type="checkbox" rel="2341" id="subcat2341" class="1015" />Level 2 Cat 6
                        <ul>
                            <li>
                                <input type="checkbox" rel="5006" class="2341" />Level 3 Cat 1
                            </li>
                            <li>
                                <input type="checkbox" rel="5005" class="2341" />Level 3 Cat 2
                            </li>
                            <li>
                                <input type="checkbox" rel="5004" class="2341" />Level 3 Cat 3
                            </li>
                        </ul>
                </li>
                <li>
                    <input type="checkbox" rel="2340" id="subcat2340" class="1015" />Level 2 Cat 7
                </li>
            </ul>
    </li>
</ul>

【问题讨论】:

  • 你为什么在脚本标签中写PHP??从它周围删除脚本标签。
  • 可以多级分享生成的html吗
  • 虽然不一定是错误,但您的 while 循环正在创建多个 $(document).ready() 函数。通过&lt;script&gt; $(document).ready() {&lt;?php while($catdatarow = mysql_fetch_array($catdata)){ ..} while($subcatdatarow = mysql_fetch_array($subcatdata)){.. } ?&gt; } 可以达到相同的效果。这可能不是错误的原因,但它是糟糕的编码实践,并为生成的不需要存在的 html/javascript 添加了很多复杂性。
  • @Zword:请注意,PHP 会为每个唯一的类别 id 动态编写脚本。
  • @ArunPJohny:HTML 已附加:

标签: php jquery html checkbox


【解决方案1】:

试试类似的东西

$(document).ready(function () {
    $('.results > li').hide();
    $('ul input[type="checkbox"][rel]').change(function () {
        $(this).next('ul').find('> li > input')[this.checked ? 'not' : 'filter'](':checked').prop('checked', this.checked).trigger('change');
        var $target = $('.results li.' + $(this).attr('rel'));
        if (this.checked) {
            $target.stop(true, true).slideDown();
        } else {
            $target.stop(true, true).slideUp();
        }
    })
});

演示:Fiddle

【讨论】:

  • 再次感谢,这不仅帮助了我,而且教会了我很多。我的初学者水平现在比以往任何时候都更加明显。 :)
  • 如果可能的话,我希望能更好地理解代码。
  • 阿伦,“if (this.checked) {}”如何更改为检查多个类,(类别),因为要向上/向下滑动的 li 可以属于多个类别, (
  • ),如果两者都被选中而一个未被选中,则触发 slideUp 不应该因为另一个仍然被选中?
  • @vigilantis 如果有两个类,您能否再次澄清它,然后您只想在选中两个复选框时才显示它
  • 如果一个 li 有多个类,它应该在任何一个复选框被选中时显示。目前,如果 li 有 1001 和 1002 类并且两者都被选中,它会显示,如果我取消选中 1002,它应该仍然显示,因为 1001 仍然被选中,但它会隐藏。
  • 【解决方案2】:

    我认为您想要做的是根据上层类别过滤您的结果。如果是这样的话,我相信这条线:

    echo("$(\"." . $catdatarow['catid'] . "\").prop(\"checked\",$(\"#cat" . $catdatarow['catid'] . "\").prop(\"checked\"))");
    

    还有这一行

    echo("$(\"." . $subcatdatarow['subcatid'] . "\").prop(\"checked\",$(\"#subcat" . $subcatdatarow['subcatid'] . "\").prop(\"checked\"))");
    

    需要改成

       echo("$(\"." . $catdatarow['catid'] . "\").each(function(){($this).prop(\"checked\",$(\"#cat" . $catdatarow['catid'] . "\"))}");
    

     echo("$(\"." . $subcatdatarow['subcatid'] . "\").each($(this).prop(\"checked\",$(\"#subcat" . $subcatdatarow['subcatid'] . "\"))}");
    

    这样您就可以取消选中与给定父类别复选框关联(通过 html 类)的所有复选框。

    希望这会有所帮助。

    【讨论】:

    • 谢谢,这也有效,但我决定采用 Arun 的解决方案,因为它还清理了您最初指出的不符合标准的脚本。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签