【问题标题】:jQuery - Count elements with a certain class inside a parent elementjQuery - 计算父元素内具有某个类的元素
【发布时间】:2011-04-30 14:37:11
【问题描述】:

我得到了这个 HTML 结构:

<form>
    <input class="myTrigger" type="radio" value="1"/>
    <input class="myTrigger" type="radio" value="2"/>
    <fieldset>
        <ul class="class1">
            <li></li>
        </ul>
        <ul class="class2">
            <li></li>
        </ul>
    </fieldset>
    <fieldset>
        <ul class="class2">
            <li></li>
        </ul>
        <ul class="class2">
            <li></li>
        </ul>
    </fieldset>
</form>

使用 jQuery,我需要遍历每个 ul 并隐藏那些没有类的 myClass (由 checked radio .myTrigger 定义) 然后我需要检查现在为空的fieldset 的(即:fieldsets,其中没有 ul 有 myClass 类)并完全隐藏它们。

到目前为止,我能够隐藏所需的 ul,但不能隐藏 fieldsets。这是我得到的:

function myFunction() {

        var myClass = "class"+($("radio:checked").attr("value"));
        var productGroup = $("form ul");

        $("form fieldset").each(function(index){

            groupCheck = 0;

            $.each(productGroup, function(index, obj){
                if($(obj).hasClass(myClass))
                    {
                        groupCheck += 1;
                        $(obj).show();
                    }
                else
                    {
                        $(obj).hide();
                    };
            })

            if (groupCheck == 0)
                {
                    $(this).hide();
                }
            else {
                    $(this).show();
                };

        });

    };
myFunction();
$(".myTrigger").change(myFunction);

我还在同一页面上获得了切换相同 ul 的其他脚本 ex:(legend).click(function(){$(this).siblings("ul").toggle();}); 所以无法隐藏基于ul 的字段集已经隐藏。相反,我需要寻找存在与否的类(“myClass”)。

(即:虽然小脚本只是为了方便用户而对 ul 进行转换,但“myFunction”需要根据“myTrigger”选择过滤 ul 和要显示的字段集。)

【问题讨论】:

    标签: jquery class foreach


    【解决方案1】:

    不需要循环;只需使用适当的选择器定位您想要显示/隐藏的内容:

    var myClass = 'class' + $('radio:checked:first').attr('value');
    
    // Hide all the <ul>s
    $('ul.' + myClass).hide();
    
    // First, show all the fieldsets, in case any were hidden earlier
    $('fieldset').show(); 
    
    // Now hide the ones that don't have any visible <ul>s inside
    $('fieldset:not(:has(ul:visible))').hide();
    

    【讨论】:

    • 如果那里有其他uls,您可能需要添加'fieldset:not(:has(ul.' + myClass + ':visible))'
    • 应该隐藏没有有myClass的uls。
    • 您的代码可以正常工作(使用@Felix Kling 修改),除了我在同一页面中根据不同的事件隐藏和显示相同的 ul 的其他 spripts。这使得 ul:visible 选择器不可行。为此,我认为我真的需要在隐藏字段集时坚持类检查。有什么想法吗?
    • 刚刚想通了。而不是 :visible 我正在寻找我的班级 - $('fieldset:not(:has(ul."+myClass+"))').hide(); - 并使用您的其余代码。你是对的,不需要任何循环。现在工作正常 =) thx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多