【问题标题】:Filtering data in Javascript在 Javascript 中过滤数据
【发布时间】:2014-02-18 20:27:45
【问题描述】:

我的 html 页面上有一个元素列表 (DIV),如下所示。

同一页面上有一个标签列表。

我需要当用户点击主题标签(例如#bacteria)时,只显示包含该主题标签的那些 DIV。

实现它的最轻量级和最简单的方法是什么?

<div class='entry'>
    <p>#antibiotics destroy #e-coli and that&#39;s not good!!!!</p>
    <!-- Hashtags: #antibiotics #eColi -->
    <!-- UID: 755a2a60-972e-11e3-a464-872f2fc4dea2 -->
</div>

<div class='entry'>
    <p>#bacteria can be #friendly, such as #e-coli for example</p>
    <!-- Hashtags: #bacteria #friendly #eColi -->
    <!-- UID: 6cc66d00-972e-11e3-a464-872f2fc4dea2 -->
</div>

<div class='entry'>
    <p>#antibiotics can fight #bacteria</p>
    <!-- Hashtags: #antibiotics #bacteria -->
    <!-- UID: b37992c0-9686-11e3-8b2c-c97ae6645b3b -->
</div>

我知道 Angular 对这类东西很强大,但我想使用一些轻量且简单的东西。就像也许可以用 jQuery 或其他东西来做到这一点......

仅供参考,整个事情在 Node.Js / Express.Js 上运行,并带有 EJS 渲染。

谢谢!

更新

假设现在我需要检查几个主题标签。就像contains 变量不是字符串而是数组一样,我只需要显示包含该数组所有值的条目。我将如何更改代码?尝试这样做,但无法管理...非常感谢!

【问题讨论】:

  • 您可以将主题标签添加到属性中吗?类似data-hash="bacteria friendly"?这样做会更容易一些
  • 您需要类似 $('*:contains("#antibiotics")'); 的内容才能在每个 .entry 类中找到主题标签。对于匹配的,您然后选择并执行您的操作。这可能会极大地影响您的表现。特别是如果您的页面包含数千个这样的内容。

标签: javascript jquery ejs


【解决方案1】:

使用:contains jquery selector

$(document).ready(function(){
    $('.entry').hide();
    $('.links').on('click','a',function(e){
        var $ctx = $(e.target);
        var contains = $ctx.text();
        $('.entry').hide();
        $('.entry:contains('+contains+')').show();
        return false;
    });    
});

示例:http://jsfiddle.net/LA3tD/

编辑

您可以使用带逗号的文本然后拆分,或者使用带有分隔符的数据属性,然后将其拆分为串联的过滤器选择器

$(document).ready(function(){
    $('.entry').hide();
    $('.links').on('click','a',function(e){
        var $ctx = $(e.target);
        var contains = $ctx.text();
        $('.entry').hide();
        if(contains.indexOf(',')!=-1){
            var tags = contains.split(',');
            var filt = '';
            $.each(tags,function(i,el){
                filt += ':contains('+el+')';
            });
            // :contains can be concatenated multiple times f.e.: ":contains(foo):contains(bar)"
            $('.entry'+filt).show();
        }else{
            $('.entry:contains('+contains+')').show();
        };
        return false;
    });    
});

更新示例:http://jsfiddle.net/LA3tD/1/

【讨论】:

  • 顺便说一句,返回 false 是什么;来这里?
  • 只是我的一个编码习惯,如果你想防止事件冒泡就返回false,但这是另一个不相关的话题,你可以跳过它
  • 还有一个问题,假设现在我需要检查几个主题标签。就像 contains 不是字符串而是数组一样,我只需要显示包含所有这些条目的条目。我将如何更改代码?尝试这样做,但无法管理...非常感谢!!!
  • 当然,也许它可以帮助解决这个话题stackoverflow.com/questions/1357118/…
  • @deemeetree 用新要求编辑您的问题,如果您不介意,我会在空闲时间更新答案
【解决方案2】:

理想情况下,您应该将您的标签数据合并到 div 本身中......也许使用 data-* 属性:

<div class='entry' data-hashtags='antibiotics bacteria'>

然后通过 jQuery 你可以遍历它们隐藏不匹配的那些:

var clickedHashtag = x //get the clicked on hashtag however you like

$('.entry').each(function(){
    if($(this).data('hashtags').indexOf(clickedHashtag)>=0){
        $(this).hide()
    }
})

小提琴:http://jsfiddle.net/Jz3gZ/

【讨论】:

  • 看起来是一个不错的解决方案,但对我不起作用...您确定所有的 DIV 元素都被引用了吗?我确实按照您的建议将名称移到标签中,但没有运气..
  • @deemeetree 啊,我的错。您需要将数据属性视为字符串并在其中查找匹配项的索引。我已经更新了我的答案并包含了一个有效的 jsfiddle。
  • 谢谢!我可以在 .entry div 元素上使用 .indexOf 吗?我试过了,但无法让它工作......谢谢!
  • @deemeetree 我不知道我是否关注您的问题。在此示例中,将有多个 .entry 元素。但是,是的,您几乎可以使用任何您想要的选择器,只要它返回您想要与之交互的节点。
【解决方案3】:

未经测试:

$('.entry').each(function(item) { $(item).show($item.is('.' + hashtag)); });

当然,您必须将主题标签添加为一个类:

<div class="entry antibiotics">

【讨论】:

  • 只要标签是类名就可以了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 2017-08-26
  • 1970-01-01
  • 2020-10-08
  • 2021-08-24
相关资源
最近更新 更多