Ммм, немного хитро, но я думаю, что с легким рефакторингом кода и небольшим покерным утомлением вы сможете запускать фильтр из обработчика 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();
});