【问题标题】:Creating filter buttons that have an ID, that filter through elements with a rel of that same ID创建具有 ID 的过滤器按钮,用于过滤具有相同 ID 的 rel 的元素
【发布时间】:2012-01-15 07:19:31
【问题描述】:

这是我的问题。我的网站上有这些过滤按钮,每个按钮都有一个名称,例如“UI、DEVELOPMENT、DATABASE 等”。

<ul class="tags_list">
    <li><a href="#" id="tag_ui">Ui</a></li>
    <li><a href="#" id="tag_database">Database</a></li>
    ...etc
</ul>

然后页面中有一堆元素的 REL 等于其中一个 ID。

<ul class="story_list">
    <li rel="tag_ui"> *SOME CONTENT* </li>
    <li rel="tag_database"> *SOME CONTENT* </li>
    ...etc
</ul>

我目前也有一些 jquery,因此当您单击“tags_list”过滤器按钮之一时,它会切换任何“story_list”元素以隐藏或显示,具体取决于“tags_list”按钮是否被选中或不是。

$(".tags_list li a").on('click',function() {
    var relid = this.id;
    $(".story_list li[rel!='" + relid + "']").toggle('fast');
    return false;
});

现在,当您只需单击“TAG_UI”按钮,然后再次单击以停用它时,此代码就可以正常工作。但是当你激活了 TAG_UI 后,你也点击了 TAG_DATABASE,会发生“story_li”元素但是这两个会出现,而这两个会隐藏。

我真正需要的是:

  • 当您最初单击过滤器按钮时,只有那些关联的 元素会显示,其他一切都会隐藏。
  • 当您单击另一个过滤器按钮时,未停用 第一个,只有这两个相关的元素显示,但一切 else 仍然隐藏。

所以它基本上是一个过滤器。在初始页面加载时,所有内容都会显示,但是当您开始单击过滤器按钮时,只会显示与这些按钮关联的元素。

我知道这是冗长的,所以希望一切都有意义。如果您需要任何澄清,请告诉我。

提前致谢!

【问题讨论】:

  • 这里缺少一些东西。 show 代码在哪里?您的代码只执行.hide(),但您说再次单击同一元素以切换相关的story_list elems 是有效的。
  • But when you have TAG_UI activated, then you also click TAG_DATABASE, what happens is that "story_li" element BUT those two will show up, and those two will hide. 你能修正/澄清这句话的最后一部分吗?
  • 啊,废话。实际上应该是切换。我搞砸了。对不起!我会编辑。
  • &lt;li&gt; 元素没有 rel 属性,对于确实存在的那些元素,它不需要另一个属性的 id。如果您想为 JS 编写自己的属性,请使用 HTML 5 的 data-* 属性,不要滥用具有明确含义的内容。

标签: jquery html filter


【解决方案1】:

在选择和取消选择事物的同时添加一些类将对您有很大帮助并让您对事物进行样式化。

这样的事情应该可以工作:

var list = $(".story_list li");
$(".tags_list li a").on('click',function( event ) {
    event.preventDefault();

    var relid = this.id,
        that = $( this );
    if ( that.is(".selected") ) {
        that.removeClass( "selected" );
        list.filter("[rel='" + relid + "']").removeClass("selected").hide("fast");
    } else {
        list.filter(":not(.selected)[rel!='" + relid + "']")
            .removeClass("selected").hide("fast");
        list.filter("[rel='" + relid + "']")
            .addClass("selected").show("fast");
        that.addClass( "selected" );
    }
    // If nothing selected show everything
    if ( !list.filter(".selected").length ){
        list.show("fast");
    }
});

示例:http://jsfiddle.net/petersendidit/TPjyG/

【讨论】:

  • 天哪!从你的 jsfiddle 来看,这看起来是完全正确的。我会测试一下并告诉你。
  • 你,我的朋友,是个天才!像魅力一样工作!
  • +1;上面的动画看起来有点时髦,但我喜欢它:)
【解决方案2】:

初始化一个跟踪按钮是否已被点击的全局变量,如下所示:

var buttonClicked = false;

然后在您的click 回调中,隐藏具有story_list 类的元素中的每个&lt;li&gt; 元素并跟踪现在已单击按钮,如下所示:

$(".tags_list li a").on('click',function() {
    var relid = this.id;
    if(!buttonClicked) {
        $(".story_list li").hide();
        buttonClicked = true;
    }
    $(".story_list li[rel='" + relid + "']").toggle('fast');
    return false;
});

【讨论】:

  • 射击,我一开始没有注意到这个答案。你的效果很好。但我想我需要添加一个“全部”过滤器按钮来显示所有内容。如果我这样做,我认为这将是完美的。我会试试这个然后回来更新。
【解决方案3】:

所以基本上它似乎归结为关联元素,其 rel 属性与被点击的过滤器匹配,在隐藏和显示之间切换。

这应该满足第一次单击时显示元素的条件,如果单击第二种类型,则只会显示这两种类型。

再次单击过滤器将隐藏关联的元素;

$('.tags_list a').on('click', function() {
   $(".story_list li[rel='" + this.id + "']".toggle();
}

请参阅http://jsfiddle.net/Ubxuf/ 以检查这是否是您想要的?

【讨论】:

  • 这实际上是我已经拥有的。请参阅我的编辑。很抱歉!
  • @jkilp 你的有一个!= 我认为它应该等于=
  • 哦,抱歉,我没有注意到那部分。您发布的代码有效,但实际上与我的目标完全相反。使用您的代码,最初会显示所有“.story_list”元素,但是如果我单击“tag_ui”的过滤器按钮,它会隐藏所有带有 REL="tag_ui" 的“.story_li”元素。但我想要发生的是,其他一切都被隐藏了,但那一个保持可见。
  • 虽然,现在我想起来了。做你所做的很容易,而且很有意义。我可以简单地更改活动按钮和非活动按钮的外观,以便用户知道他们是否单击了其中一个过滤器按钮,它会隐藏那个按钮而不是隐藏所有其余按钮......嗯......如果我找不到好的解决方案我可能最终会这样做。
  • 啊,两秒钟后你错过了我的更新。这将是在开始时隐藏所有 .story_list 元素或执行 @Anthony Grist 对全局变量所做的事情
【解决方案4】:

设计的问题是您试图用相同的逻辑处理不止一种类型的状态转换。根据所选按钮的设置,您有不同的行为:

  • 如果全部未选中,则过滤器将停用并显示所有项目
  • 如果选择了一个或多个,则过滤器被激活并且只显示那些项目

解决这个问题的一种方法是检查两种状态,并为每个状态进行适当的转换:

on click:
  figure out the new state for the currently clicked button

  if enabling this button:
    check the previous state for all buttons

    if all buttons were unselected:
      hide all but the currently selected choice
      exit function

    show the filtered items
    exit function

  else (disabling this button):
    check the new state for all buttons

    if all buttons will now be unselected:
      show all but the previously selected choice
      exit function

    hide the filtered items
    exit function

您可以使用the jQuery data methodaddClassremoveClass 方法将当前的“isSelected”状态存储在按钮本身上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2017-06-13
    • 1970-01-01
    • 2012-04-09
    相关资源
    最近更新 更多