【问题标题】:link to a page with data filter preselected链接到预先选择了数据过滤器的页面
【发布时间】:2019-03-29 08:36:12
【问题描述】:

我不是一个出色的程序员,而且我从未在这个网站上提出过任何问题,所以请耐心等待。

我有一个页面,该页面有一个通过单击按钮来过滤数据的菜单。

这是页面:https://troubletest1.jcink.net/index.php?act=Pages&kid=char2

我想要的是能够使用已经为您预先选择的一个(或多个)过滤器创建一个指向该页面的链接。

例如,其中一个过滤器是按角色的作者进行的。在这种情况下,我们将使用我,Jennz。

<div class="button2-group" data-filter-group="ooc">
<myh1>Who Plays Who</myh1>
<button2 class="button2 is-checked" data-filter="">all</button2>
<button2 class="button2" data-filter=".lexi">Lexi - Staff</button2>
<button2 class="button2" data-filter=".jennz">Jennz - Staff</button2>

我尝试了一些我认为相似并且可能有效的方法,但它们对我不起作用。

喜欢这个:

https://stackoverflow.com/a/49883277/10554102

最重要的是,我希望能够创建一个指向该页面的链接,该链接仅显示特定作者所扮演的角色,而不是整个角色网格。

我将不胜感激这方面的任何帮助。提前致谢。

编辑:

添加正在使用的代码:

$(document).ready( function() {
// init Isotope
var $grid = $('.grid').isotope({


itemSelector: '.grid-item'
 });

 // store filter for each group
 var filters = {};

 $('.filters').on( 'click', '.button2', function() {
   var $this = $(this);
   // get group key
   var $button2Group = $this.parents('.button2-group');
   var filterGroup = $button2Group.attr('data-filter-group');
   // set filter for group
   filters[ filterGroup ] = $this.attr('data-filter');
   // combine filters
   var filterValue = concatValues( filters );
   // set filter for Isotope
   $grid.isotope({ filter: filterValue });
 });

 // change is-checked class on button2s
 $('.button2-group').each( function( i, button2Group ) {
   var $button2Group = $( button2Group );
   $button2Group.on( 'click', 'button2', function() {
     $button2Group.find('.is-checked').removeClass('is-checked');
     $( this ).addClass('is-checked');
   });
 });

});

// layout Isotope after each image loads
$grid.imagesLoaded().progress( function() {
  $grid.isotope('layout');
});

// flatten object by concatting values
function concatValues( obj ) {
 var value = '';
 for ( var prop in obj ) {
   value += obj[ prop ];
 }
 return value;
}

编辑 2:

在尝试了 James Hull 建议的代码后,我遇到了另一个问题。

这是我放置代码的方式:

<script type="text/javascript">
$(document).ready( function() {
 // init Isotope
 var $grid = $('.grid').isotope({
   itemSelector: '.grid-item'
 });


// Sample code using jQuery trigger
$(function(){
    var paramsString = "ooc=jennz&ooc=lexi"; // example search url
    // IE does not support URLSearchParams().
    // So you'll need to find another way to get the params if IE support needed
    var searchParams = new URLSearchParams(paramsString);
    // Iterate the search parameters.
    for (var p of searchParams) {
        // trigger appropriate filters
        $('[data-filter-group="' + p[0]  + '"').find('[data-filter=".' + p[1] + '"]').trigger('click');
    }
});

这就是我做链接的方式:
https://troubletest1.jcink.net/index.php?act=Pages&kid=char2#.lexi

现在,除非我手动进入并选择“全部”过滤器按钮,否则页面根本不会重置。通常,它会在页面刷新时默认恢复为“全部”,而现在没有这样做。每当我访问该页面时,即使链接没有#.lexi 或任何参数,它仍然只选择她的特定字符。

正如我所说,我是这方面的新手,所以我不确定自己在做什么。

【问题讨论】:

  • 您可以将参数作为查询字符串参数传递到您的 url 中,然后在页面加载时从 url 中获取这些参数,然后使用它来过滤页面。这篇文章可能会有所帮助(arungudelli.com/tutorial/javascript/…
  • 感谢@RyanWilson 的回复,我查看了那篇文章。我传递了参数,但我不知道如何让它触发过滤器。在这种情况下,我想触发按钮点击是需要发生的。
  • 过滤器按钮点击事件是否附加到使用jQuery的按钮上?
  • @JamesHull 我相信是的。我已将相关代码添加到原始帖子中。感谢您的观看。

标签: jquery button filter hyperlink click


【解决方案1】:

jQuery trigger() 函数应该足够了。如果您可以像上面在 cmets 中提到的那样获取查询字符串参数,那么您应该能够使用名称/值对来触发相应的按钮。 'name' 是过滤器组,'value' 是特定过滤器。

$(document).ready(function() {
    // init Isotope
    var $grid = $('.grid').isotope({
        itemSelector: '.grid-item'
    });

    // store filter for each group
    var filters = {`enter code here`};

    $('.filters').on( 'click', '.button2', function() {
        var $this = $(this);
        // get group key
        var $button2Group = $this.parents('.button2-group');
        var filterGroup = $button2Group.attr('data-filter-group');
        // set filter for group
        filters[ filterGroup ] = $this.attr('data-filter');
        // combine filters
        var filterValue = concatValues( filters );
        // set filter for Isotope
        $grid.isotope({ filter: filterValue });
    });


    // change is-checked class on button2s
    $('.button2-group').each( function( i, button2Group ) {
       var $button2Group = $( button2Group );
       $button2Group.on( 'click', 'button2', function() {
         $button2Group.find('.is-checked').removeClass('is-checked');
         $( this ).addClass('is-checked');
      });
    });

    // IE does not support URLSearchParams().
    // So you'll need to find another way to get the params if IE support needed
    var searchParams = new URLSearchParams(window.location.search);
    // Iterate the search parameters.
    for (var p of searchParams) {
        // trigger appropriate filters
        $('[data-filter-group="' + p[0]  + '"').find('[data-filter="' + p[1] + '"]').trigger('click');
    }

});

// layout Isotope after each image loads
$grid.imagesLoaded().progress( function() {
  $grid.isotope('layout');
});

// flatten object by concatting values
function concatValues( obj ) {
 var value = '';
 for ( var prop in obj ) {
   value += obj[ prop ];
 }
 return value;
}

【讨论】:

  • 确保在点击事件附加到按钮后,触发按钮的代码需要在文档就绪函数中定义。
  • 谢谢,这对我有用,并且符合我目前的目的。但是,有没有办法让 paramsString 变量更加动态,这样您就不必在其中硬编码像 ooc=jenz 这样的东西?
  • 另外,发现了一个问题。选择一个后不会重置页面。我会将代码添加到我的 OP 中以显示我是如何做到的。但是,当我使用链接转到一个人的页面时,它可以很好地显示他们的角色。如果我尝试使用另一个人的另一个链接转到该页面,它仍然显示人 1 的字符,而不是人 2 的字符。
  • 硬编码字符串只是一个例子。您需要使用window.location.search 从实时 URL 中获取实际查询字符串。您需要保留将 jQuery 单击事件分配给按钮的代码,删除它们可能是过滤器现在可能无法正常工作的原因。我已经更新了我的代码答案,以包含您的代码和我的代码中的所有内容。
  • 所以现在你应该可以像前面的示例文本troubletest1.jcink.net/…那样使用链接了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 2021-09-21
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多