JavaScript - 设置函数返回基于 1 或 2 个选定标签的所有项目(无 jQUERY)

标签 javascript

我有一些 JavaScrip,用于检查是否选择了任何媒体标签或行业标签 - 这样投资组合项目就可以在浏览器中进行相应的排序和显示。

我所拥有的几乎 100% 有效,但我不知道如何制作它,以便如果仅选择媒体标签或仅选择行业标签,则投资组合项目仍应相应排序。目前,您必须选择媒体标签和行业标签,但我希望用户能够仅使用媒体标签或行业标签进行搜索。

这是我想要完成的任务:如果仅选择一个媒体标签,则获取与该媒体标签关联的所有投资组合片段。如果仅选择行业标签,则获取与该行业标签关联的所有组合项目。如果同时选择媒体标签和行业标签,则获取与两者关联的所有组合项目。

Vanilla JS 不是我的强项,所以请原谅我,如果这是一个愚蠢的问题,但这已经让我困惑了几个小时。

请不要使用 jQuery 答案,因为整个页面的功能是使用 JavaScript 构建的。

这是函数:

var update = function () {
    closeDrawer();
    // update ui to reflect tag changes
    // get our list of items to display

    var itemsToDisplay = [];
    var currentMediaTag = controlsContainer.querySelector('.media.selected');
    var currentIndustryTag = controlsContainer.querySelector('.industry.selected');

    if (currentMediaTag != "" && currentMediaTag != null) {
        selectedMediaFilter = currentMediaTag.innerHTML;
    }

    if (currentIndustryTag != "" && currentIndustryTag != null) {
        selectedIndustryFilter = currentIndustryTag.innerHTML;
    }

    if (selectedMediaFilter == "" && selectedIndustryFilter == "") {
        itemsToDisplay = portfolioItems.filter(function (item) {
            return item.preferred;
        });

    } else {
        itemsToDisplay = portfolioItems.filter(function (item) {
            var mediaTags = item.media_tags,
                industryTags = item.industry_tags;

            if(industryTags.indexOf(selectedIndustryFilter) < 0){
                return false;
            }
            else if(mediaTags.indexOf(selectedMediaFilter) < 0){
                return false;
            }

            else{
                return true;
            }
        });
    }
    renderItems(itemsToDisplay);
}

不完全确定这是必要的,但以防万一,这里是处理投资组合页面的完整 JS 文件:

(function ($) {
    document.addEventListener("DOMContentLoaded", function (event) {
        // for portfolio interaction
        var portfolioGrid = (function () {
            var gridSize = undefined,
                parentContainer = document.querySelector('.portfolio-item-container');
            containers = parentContainer.querySelectorAll('.view'),
                drawer = parentContainer.querySelector('.drawer'),
                bannerContainer = drawer.querySelector('.banner-container'),
                thumbsContainer = drawer.querySelector('.thumbs-container'),
                descriptionContainer = drawer.querySelector('.client-description'),
                clientNameContainer = drawer.querySelector('.client-name'),
                controlsContainer = document.querySelector('.portfolio-controls-container'),
                selectedMediaFilter = "", selectedIndustryFilter = "";

            var setGridSize = function () {
                var windowSize = window.innerWidth,
                    previousGridSize = gridSize;

                if (windowSize > 1800) {
                    gridSize = 5;
                } else if (windowSize > 900) {
                    gridSize = 4;
                } else if (windowSize > 600 && windowSize <= 900) {
                    gridSize = 3;
                } else {
                    gridSize = 2;
                }

                if (previousGridSize != gridSize) {
                    closeDrawer();
                }
            };

            var attachResize = function () {
                window.onresize = function () {
                    setGridSize();
                };
            };

            var getRowClicked = function (boxNumber) {
                return Math.ceil(boxNumber / gridSize);
            };

            var getLeftSibling = function (row) {
                var cI = row * gridSize;
                return containers[cI >= containers.length ? containers.length - 1 : cI];
            };

            var openDrawer = function () {
                drawer.className = 'drawer';
                scrollToBanner();
            };

            var scrollToBanner = function () {
                var mainContainer = document.querySelector('#main-container'),
                    mainBounding = mainContainer.getBoundingClientRect(),
                    scrollY = (drawer.offsetTop - mainBounding.bottom) - 10,
                    currentTop = document.body.getBoundingClientRect().top;

                animate(document.body, "scrollTop", "", document.body.scrollTop, scrollY, 200, true);
            };

            var animate = function (elem, style, unit, from, to, time, prop) {
                if (!elem) return;
                var start = new Date().getTime(),
                    timer = setInterval(function () {
                        var step = Math.min(1, (new Date().getTime() - start) / time);
                        if (prop) {
                            elem[style] = (from + step * (to - from)) + unit;
                        } else {
                            elem.style[style] = (from + step * (to - from)) + unit;
                        }
                        if (step == 1) clearInterval(timer);
                    }, 25);
                elem.style[style] = from + unit;
            }

            var closeDrawer = function () {
                drawer.className = 'drawer hidden';
            };

            var cleanDrawer = function () {
                bannerContainer.innerHTML = "";
                clientNameContainer.innerHTML = "";
                descriptionContainer.innerHTML = "";
                thumbsContainer.innerHTML = "";
            };

            var resetThumbs = function () {
                Array.prototype.forEach.call(thumbsContainer.querySelectorAll('.thumb'), function (t) {
                    t.className = "thumb";
                });
            };

            var handleBannerItem = function (item) {
                bannerContainer.innerHTML = "";
                if (item.youtube) {
                    var videoContainer = document.createElement('div'),
                        iframe = document.createElement('iframe');

                    videoContainer.className = "videowrapper";
                    iframe.className = "youtube-video";
                    iframe.src = "https://youtube.com/embed/" + item.youtube;
                    videoContainer.appendChild(iframe);
                    bannerContainer.appendChild(videoContainer);
                } else if (item.soundcloud) {
                    var iframe = document.createElement('iframe');
                    iframe.src = item.soundcloud;
                    iframe.className = "soundcloud-embed";
                    bannerContainer.appendChild(iframe);
                } else if (item.banner) {
                    var bannerImage = document.createElement('img');
                    bannerImage.src = item.banner;
                    bannerContainer.appendChild(bannerImage);
                }
            };

            var attachClick = function () {
                Array.prototype.forEach.call(containers, function (n, i) {
                    n.querySelector('a.info').addEventListener('click', function (e) {
                        e.preventDefault();
                    });

                    n.addEventListener('click', function (e) {
                        var boxNumber = i + 1,
                            row = getRowClicked(boxNumber);
                        var containerIndex = row * gridSize;
                        if (containerIndex >= containers.length) {
                            // we're inserting drawer at the end
                            parentContainer.appendChild(drawer);
                        } else {
                            // we're inserting drawer in the middle somewhere
                            var leftSiblingNode = getLeftSibling(row);
                            leftSiblingNode.parentNode.insertBefore(drawer, leftSiblingNode);
                        }
                        // populate
                        cleanDrawer();
                        var mediaFilterSelected = document.querySelector('.media-tags .tag-container .selected');
                        var selectedFilters = "";
                        if (mediaFilterSelected != "" && mediaFilterSelected != null) {
                            selectedFilters = mediaFilterSelected.innerHTML;
                        }
                        var portfolioItemName = '';
                        var selectedID = this.getAttribute('data-portfolio-item-id');
                        var data = portfolioItems.filter(function (item) {
                            portfolioItemName = item.name;
                            return item.id === selectedID;
                        })[0];

                        clientNameContainer.innerHTML = data.name;
                        descriptionContainer.innerHTML = data.description;
                        var childItems = data.child_items;

                        //We will group the child items by media tag and target the unique instance from each group to get the right main banner
                        Array.prototype.groupBy = function (prop) {
                            return this.reduce(function (groups, item) {
                                var val = item[prop];
                                groups[val] = groups[val] || [];
                                groups[val].push(item);
                                return groups;
                            }, {});
                        }
                        var byTag = childItems.groupBy('media_tags');
                        if (childItems.length > 0) {
                            handleBannerItem(childItems[0]);
                            var byTagValues = Object.values(byTag);
                            byTagValues.forEach(function (tagValue) {
                                for (var t = 0; t < tagValue.length; t++) {
                                    if (tagValue[t].media_tags == selectedFilters) {
                                        handleBannerItem(tagValue[0]);
                                    }
                                }
                            });
                            childItems.forEach(function (item, i) {
                                var img = document.createElement('img'),
                                    container = document.createElement('div'),
                                    label = document.createElement('p');
                                container.appendChild(img);
                                var mediaTags = item.media_tags;

                                container.className = "thumb";
                                label.className = "childLabelInactive thumbLbl";
                                thumbsContainer.appendChild(container);
                                if (selectedFilters.length > 0 && mediaTags.length > 0) {
                                    for (var x = 0; x < mediaTags.length; x++) {
                                        if (mediaTags[x] == selectedFilters) {
                                            container.className = "thumb active";
                                            label.className = "childLabel thumbLbl";
                                        }
                                    }
                                }
                                else {
                                    container.className = i == 0 ? "thumb active" : "thumb";
                                }

                                img.src = item.thumb;
                                if (item.media_tags != 0 && item.media_tags != null) {
                                    childMediaTags = item.media_tags;
                                    childMediaTags.forEach(function (cMTag) {
                                        varLabelTxt = document.createTextNode(cMTag);
                                        container.appendChild(label);
                                        label.appendChild(varLabelTxt);
                                    });
                                }
                                img.addEventListener('click', function (e) {
                                    scrollToBanner();
                                    resetThumbs();
                                    handleBannerItem(item);
                                    container.className = "thumb active";
                                });
                            });
                        }
                        openDrawer();
                    });
                });
            };

            var preloadImages = function () {
                portfolioItems.forEach(function (item) {
                    var childItems = item.child_items;
                    childItems.forEach(function (child) {
                        (new Image()).src = child.banner;
                        (new Image()).src = child.thumb;
                    });
                });
            };

//////////////////////////////////// UPDATE FUNCTION /////////////////////////////////////
            var update = function () {
                closeDrawer();
                // update ui to reflect tag changes
                // get our list of items to display

                var itemsToDisplay = [];
                var currentMediaTag = controlsContainer.querySelector('.media.selected');
                var currentIndustryTag = controlsContainer.querySelector('.industry.selected');

                if (currentMediaTag != "" && currentMediaTag != null) {
                    selectedMediaFilter = currentMediaTag.innerHTML;
                }

                if (currentIndustryTag != "" && currentIndustryTag != null) {
                    selectedIndustryFilter = currentIndustryTag.innerHTML;
                }

                if (selectedMediaFilter == "" && selectedIndustryFilter == "") {
                    itemsToDisplay = portfolioItems.filter(function (item) {
                        return item.preferred;
                    });

                } else {
                    itemsToDisplay = portfolioItems.filter(function (item) {
                        var mediaTags = item.media_tags,
                            industryTags = item.industry_tags;

                        if (industryTags.indexOf(selectedIndustryFilter) < 0) {
                            return false;
                        }

                        else if (mediaTags.indexOf(selectedMediaFilter) < 0) {
                            return false;
                        }

                        else {
                            return true;
                        }

                    });
                }

                renderItems(itemsToDisplay);
            }

//////////////////////////////////// RENDERITEMS FUNCTION /////////////////////////////////////

            var renderItems = function (items) {
                var children = parentContainer.querySelectorAll('.view');
                Array.prototype.forEach.call(children, function (child) {
                    // remove all event listeners then remove child
                    parentContainer.removeChild(child);
                });

                items.forEach(function (item) {

                    var container = document.createElement('div'),
                        thumb = document.createElement('img'),
                        mask = document.createElement('div'),
                        title = document.createElement('h6'),
                        excerpt = document.createElement('p'),
                        link = document.createElement('a');

                    container.className = "view view-tenth";
                    container.setAttribute('data-portfolio-item-id', item.id);

                    thumb.src = item.thumb;

                    mask.className = "mask";

                    title.innerHTML = item.name;
                    excerpt.innerHTML = item.excerpt;

                    link.href = "#";
                    link.className = "info";
                    link.innerHTML = "View Work";

                    container.appendChild(thumb);
                    container.appendChild(mask);

                    mask.appendChild(title);
                    mask.appendChild(excerpt);
                    mask.appendChild(link);
                    parentContainer.insertBefore(container, drawer);
                });

                containers = parentContainer.querySelectorAll('.view');
                attachClick();
            };

            var filterHandler = function (linkNode, tagType) {

                var prevSelection = document.querySelector("." + tagType + '.selected');
                if (prevSelection != "" && prevSelection != null) {
                    prevSelection.className = tagType + ' tag';
                }

                linkNode.className = tagType + ' tag selected';
                update();
            };

            var clearFilters = function (nodeList, filterType) {
                Array.prototype.forEach.call(nodeList, function (node) {
                    node.className = filterType + " tag";
                    console.log("Clear filters function called");
                });
            }

            var attachFilters = function () {
                var mediaFilters = controlsContainer.querySelectorAll('.tag.media'),
                    industryFilters = controlsContainer.querySelectorAll('.tag.industry'),
                    filterToggle = controlsContainer.querySelectorAll('.filter-toggle');

                // resets
                controlsContainer.querySelector('.media-tags .reset')
                    .addEventListener('click',
                    function (e) {
                        e.preventDefault();
                        selectedMediaFilter = "";
                        clearFilters(controlsContainer.querySelectorAll('.media-tags a.tag'), "media");
                        update();
                    }
                );

                controlsContainer.querySelector('.industry-tags .reset')
                    .addEventListener('click',
                    function (e) {
                        e.preventDefault();
                        selectedIndustryFilter = "";
                        clearFilters(controlsContainer.querySelectorAll('.industry-tags a.tag'), "industry");

                        update();
                    }
                );

                Array.prototype.forEach.call(filterToggle, function (toggle) {
                    toggle.addEventListener('click', function (e) {
                        if (controlsContainer.className.indexOf('open') < 0) {
                            controlsContainer.className += ' open';
                        } else {
                            controlsContainer.className = controlsContainer.className.replace('open', '');
                        }
                    });
                });

                //Attaches a click event to each media tag "button"
                Array.prototype.forEach.call(mediaFilters, function (filter) {
                    filter.addEventListener('click', function (e) {
                        e.preventDefault();
                        // var selectedMediaFilter = controlsContainer.querySelector('.media.selected');
                        //console.log("Media tag: " +this.innerHTML); *THIS WORKS*
                        filterHandler(this, "media");
                    });
                });

                Array.prototype.forEach.call(industryFilters, function (filter) {
                    filter.addEventListener('click', function (e) {
                        e.preventDefault();
                        //  var selectedIndustryFilter = this.querySelector('.industry.selected');
                        //  console.log("Industry tag: " +this.innerHTML); *THIS WORKS*

                        filterHandler(this, "industry");
                    });
                });
            };

            return {
                init: function () {
                    setGridSize();
                    attachResize();
                    attachClick();
                    preloadImages();

                    // portfolio page
                    if (controlsContainer) {
                        attachFilters();
                    }
                }
            };
        })();

        portfolioGrid.init();
    });
}());

$ = jQuery.noConflict();

最佳答案

        if(industryTags.indexOf(selectedIndustryFilter) < 0){
            return false;
        }
        else if(mediaTags.indexOf(selectedMediaFilter) < 0){
            return false;
        }

这部分让你头疼。只要没有选择行业标签或媒体标签,就会退出该功能。

更改为:

        if(industryTags.indexOf(selectedIndustryFilter) < 0 && mediaTags.indexOf(selectedMediaFilter) < 0){
            return false;
        }

现在它将测试是否至少选择了一个标签。如果是这样,则渲染项目。

关于JavaScript - 设置函数返回基于 1 或 2 个选定标签的所有项目(无 jQUERY),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45696316/

相关文章:

javascript - 检查一个或两个输入字段是否为空、值是否为 0 或负数

javascript - IE 中的选择箭头下拉列表不同

javascript - 数组属性更新后子组件未更新

javascript - 如何将我自己的 .css 和 .js 链接到 wordpress?

javascript - 在 Angular Directive(指令)中使用 ng-repeat 过滤器

javascript - jquery错误函数帮助

javascript - 如何处理固定日期的突变?

javascript - 消息: Unterminated string constant

javascript - 流程,如何从混合类型转换为更具体的类型

javascript - 即使页面已重新加载,添加的类仍然存在,如何永久应用 jQuery addClass 方法