使用 Jquery 过滤功能锚定标签和浏览器历史记录

Posted

技术标签:

【中文标题】使用 Jquery 过滤功能锚定标签和浏览器历史记录【英文标题】:Anchor tags and browser history with Jquery filter function 【发布时间】:2012-03-31 12:40:22 【问题描述】:

我正在处理一个带有用于过滤页面上产品的导航的页面。当单击链接和按下浏览器后退按钮时,我使用 jQuery hashchange 添加和删除导航链接的当前状态。但是 filter() 函数仅在单击导航链接时才起作用,我想在单击浏览器后退按钮或 url 在末尾包含锚标记时实现过滤器功能。

这是页面的链接:

http://dl.dropbox.com/u/20585252/test/index.htm

这里是相关的 Jquery 部分:

$(document).ready(function()

$(window).hashchange( function()
var hash = location.hash;

$('#nav a').each(function()
  var that = $(this);
  that[ that.attr( 'href' ) === hash ? 'addClass' : 'removeClass' ]( 'current' );
);
)

$(window).hashchange();
filter();

);


function filter() 

    $('ul#nav a').click(function() 


    var filterVal = $(this).attr('rel');

    if(filterVal == 'all') 
        $('ul.product li.hidden').show().removeClass('hidden');
     else 

        $('ul.product li').hide().each(function() 
            if(!$(this).hasClass(filterVal)) 
                $(this).hide().addClass('hidden');
             else 
                $(this).show().removeClass('hidden');
            
        );
    

);



非常感谢您指出正确的方向。

【问题讨论】:

【参考方案1】:

嗯,有点棘手,但我认为通过对代码进行轻微的重构和一些小技巧,您应该能够从 hashchange 处理程序中触发过滤器。

下面的代码未经测试,可能不太正确,但应该提供一个方法:

$(document).ready(function()
    $(window).hashchange(function()
        var hash = location.hash.replace('#','');//remove # for cross-browser compatibility
        $('#nav a').each(function()
            var that = $(this);
            //that[ that.attr( 'href' ) === hash ? 'addClass' : 'removeClass' ]( 'current' );
            if(that.attr('href') === hash) 
                that.addClass('current');
                filter.call(that);//call filter with '$(this)' as the context
            
            else 
                that.removeClass('current');
            
        );
    );
    function filter() 
        //Note: 'this' is a jquery object due to the way in which filter is called (in two places).
        var filterVal = this.attr('rel');
        if(filterVal == 'all') 
            $('ul.product li.hidden').show().removeClass('hidden');
        
        else 
            $('ul.product li').hide().each(function() 
                if(!this.hasClass(filterVal)) 
                    this.hide().addClass('hidden');
                
                else 
                    this.show().removeClass('hidden');
                
            );
        
    
    $('ul#nav').on('click', 'a', function()
        filter.call($(this));
    );
    $(window).hashchange();
);

【讨论】:

感谢您的帮助 - 我需要稍微调整一下 .replace('#','');破坏了 hashchange 函数,所以我必须想办法让它跨浏览器友好,但除此之外,这正是我所追求的。非常感谢 如果删除 # 会破坏它,那么如果 # 尚不存在,则需要在前面添加。比如:hash = (location.hash.match(/^#/)) ? location.hash : ('#'+location.hash);

以上是关于使用 Jquery 过滤功能锚定标签和浏览器历史记录的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jQuery 启用或禁用锚点?

PIE SDK过滤控制

从活动元素之外的所有元素中删除类

当浏览器具有一定宽度时,jQuery将类和“数据切换”添加到引导导航锚点

JS红皮书 第三版 JS的历史与使用

jQuery的历史版本