Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何基于多个属性和多个属性值显示/隐藏元素?_Javascript_Jquery_Filter_Html - Fatal编程技术网

Javascript 如何基于多个属性和多个属性值显示/隐藏元素?

Javascript 如何基于多个属性和多个属性值显示/隐藏元素?,javascript,jquery,filter,html,Javascript,Jquery,Filter,Html,我想基于属性过滤器查看/隐藏页面上的div。我已经创建了几个属性,它们可以有多个值。用户可以选择要显示的内容 我无法获得正确的算法(或者我不知道要使用哪个Javascript/jQuery函数)。下面的方法显然不起作用。我首先显示所有项目,然后循环过滤,隐藏与属性不匹配的项目(读取:循环中的当前属性)。这意味着即使项目稍后可能与某个属性匹配,也会被隐藏 如何使此过滤器机制正常工作,并且不排除/隐藏循环中稍后基于选定属性不需要隐藏的项目?可能有一些OR运算符可用于属性选择('div[group=f

我想基于属性过滤器查看/隐藏页面上的div。我已经创建了几个属性,它们可以有多个值。用户可以选择要显示的内容

我无法获得正确的算法(或者我不知道要使用哪个
Javascript/jQuery
函数)。下面的方法显然不起作用。我首先显示所有项目,然后循环过滤,隐藏与属性不匹配的项目(读取:循环中的当前属性)。这意味着即使项目稍后可能与某个属性匹配,也会被隐藏

如何使此过滤器机制正常工作,并且不排除/隐藏循环中稍后基于选定属性不需要隐藏的项目?可能有一些OR运算符可用于属性选择
('div[group=firstgroup | thirdgroup]')

Javascript:

    $(document).ready(function() {
        var items = $('#items').find('div');
        $(items).show();

        var groupsToShow = Array('firstgroup','thirdgroup');
        var namesToShow = Array('Fred','Pete');
        var applicationsToShow = Array('light');

        for(var i=0;i<groupsToShow;i++) {
            $(items).find('div[group!='+groupsToShow[i]+']').hide();    
        }

        for(var i=0;i<namesToShow;i++) {
            $(items).find('div[name!='+namesToShow[i]+']').hide();    
        }

        for(var i=0;i<applicationsToShow;i++) {
            $(items).find('div[application!='+applicationsToShow[i]+']').hide();    
        }
    });
<div id="items">
    <div group="firstgroup" name="Rob" application="special"></div>
    <div group="firstgroup" name="Fred" application="light"></div>
    <div group="secondgroup" name="Pete" application="special"></div>
    <div group="thirdgroup" name="Pete" application="special"></div>
    <div group="thirdgroup" name="Pete" application="light"></div>
    <div group="secondgroup" name="Pete" application="normal"></div>
    <div group="thirdgroup" name="Pete" application="special"></div>
</div>
$(文档).ready(函数(){
var items=$('#items')。查找('div');
$(items.show();
var groupsToShow=Array('firstgroup','thirdgroup');
var namesthow=Array('Fred','Pete');
var applicationsToShow=数组('light');

对于(var i=0;i,您可以使用add()构建要显示的项目列表:

$(文档).ready(函数(){
var items=$('#items')。查找('div');
$(items.hide();
var groupsToShow=['firstgroup','thirdgroup'];
var namesthow=['Fred','Pete'];
var applicationsToShow=['light'];
var$itemsToShow=$();

对于(var i=0;i,您可以使用add()构建要显示的项目列表:

$(文档).ready(函数(){
var items=$('#items')。查找('div');
$(items.hide();
var groupsToShow=['firstgroup','thirdgroup'];
var namesthow=['Fred','Pete'];
var applicationsToShow=['light'];
var$itemsToShow=$();

对于(var i=0;i,据我所知,只有当元素满足所有三个数组中包含的内容时,才需要显示它们。因此,在上述情况下,第二个和第五个div将是唯一显示的……对吗

如果我的假设是正确的,那么这应该是可行的:

var show = {
    'group': ['firstgroup','thirdgroup'],
    'name': ['Fred','Pete'],
    'application': ['light']
};

$('#items div')
    .hide()
    .filter(function(){
        // Only returns true for elements
        // that satisfy all three arrays
        for (var i in show) {
            var attr = $(this).attr(i),
                match = ('|' + show[i].join('|') + '|').indexOf(attr) > -1;
            if (!match) {
                return false;
            }
        }
        // If we reach this point then we can assert
        // that the element contains all required attributes
        return true;
    })
    .show();

据我所知,如果元素满足所有三个数组中所包含的内容,您只希望显示元素。因此在上述情况下,第二个和第五个div将是唯一显示的元素…对吗

如果我的假设是正确的,那么这应该是可行的:

var show = {
    'group': ['firstgroup','thirdgroup'],
    'name': ['Fred','Pete'],
    'application': ['light']
};

$('#items div')
    .hide()
    .filter(function(){
        // Only returns true for elements
        // that satisfy all three arrays
        for (var i in show) {
            var attr = $(this).attr(i),
                match = ('|' + show[i].join('|') + '|').indexOf(attr) > -1;
            if (!match) {
                return false;
            }
        }
        // If we reach this point then we can assert
        // that the element contains all required attributes
        return true;
    })
    .show();

但这意味着第一个div(group=firstgroup name=rob application=special)将包含在$(itemsToShow)数组中(基于第一个groupsToShow数组),但它最终应该被隐藏,因为它不包含在namesToShow和applicationsToShow中…换句话说,过滤器不会相互影响。我的印象是您想要或它们。没错,这是因为值,而不是属性…感谢您的努力,但这意味着(使用group=firstgroup name=rob application=special)将包含在$(itemsToShow)数组中(基于第一个groupsToShow数组),但它最终应该被隐藏,因为它不包含在namesToShow和applicationsToShow中…换句话说,过滤器不会相互影响。我觉得你想要或它们。没错,但这是因为值,而不是属性…谢谢你的努力,虽然我认为你有我的需要。我会尝试,让你试试我想你有我的需要。我会试试,让你知道一点。