enmi12/glossaire/_posts/docs/2011-06-16-hash-history-jquery-bbq.mdown
author ymh <ymh.work@gmail.com>
Wed, 16 Oct 2019 11:23:38 +0200
changeset 14 00ac8f60d73f
parent 0 d970ebf37754
permissions -rwxr-xr-x
remove unused plugins
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
---
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
title: Hash history with jQuery BBQ
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
category: docs
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
layout: default
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
toc:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
  - { title: Markup, anchor: markup }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
  - { title: jQuery script, anchor: jquery_script }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
---
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
As cool as Isotope is, the only thing that could make it even cooler would be adding bookmark-able URL hashes. Ben Alman's [jQuery BBQ](http://benalman.com/projects/jquery-bbq-plugin/) allows us to do just that.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
> jQuery BBQ leverages the HTML5 hashchange event to allow simple, yet powerful bookmarkable #hash history.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
[**See Demo: Hash history**](../demos/hash-history.html)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
BBQ is a marvelous plugin that provides for a lot more functionality. The [hash history demo](../demos/hash-history.html) uses multiple options (`sortBy`, `sortAscending`, and `layoutMode` in addition to `filter`), the ability to use back-button history, and properly highlights selected links.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
Given BBQ's tremendous capabilities, the code can grow to be a bit complex. Be sure to read through [BBQ's docs](http://benalman.com/code/projects/jquery-bbq/docs/files/jquery-ba-bbq-js.html) and take look at [its examples](http://benalman.com/code/projects/jquery-bbq/examples/) before you dive in and code up your own solution.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
## Markup
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
Instead of setting the option values and keys with `data` attributes, we can add the option in the `href` for each link.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
{% highlight html %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
<ul class="option-set">
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
  <li><a href="#filter=*" class="selected">show all</a></li>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
  <li><a href="#filter=.metal">metal</a></li>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
  <li><a href="#filter=.transition">transition</a></li>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
  <li><a href="#filter=.alkali%2C+.alkaline-earth">alkali and alkaline-earth</a></li>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
  <li><a href="#filter=%3Anot(.transition)">not transition</a></li>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
  <li><a href="#filter=.metal%3Anot(.transition)">metal but not transition</a></li>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
</ul>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
{% endhighlight %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
The `href` value is a serialized string, suitable for a URL. These values can be created with [jQuery.param()](http://api.jquery.com/jQuery.param/).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
{% highlight javascript %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
$.param({ filter: '.metal' })
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
// >> "filter=.metal"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
$.param({ filter: '.alkali, alkaline-earth' })
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
// >> "filter=.alkali%2C+alkaline-earth"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
$.param({ filter: ':not(.transition)' })
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
// >> "#filter=%3Anot(.transition)"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
{% endhighlight %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
## jQuery script
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
These serialized `href` values can be converted into their proper jQuery object form when clicked using  [jQuery.deparam()](http://benalman.com/code/projects/jquery-bbq/docs/files/jquery-ba-bbq-js.html#jQuery.deparam) from jQuery BBQ.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
{% highlight javascript %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
$('.option-set a').click(function(){
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
      // get href attr, remove leading #
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
  var href = $(this).attr('href').replace( /^#/, '' ),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
      // convert href into object
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
      // i.e. 'filter=.inner-transition' -> { filter: '.inner-transition' }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
      option = $.deparam( href, true );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
  // set hash, triggers hashchange on window
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
  $.bbq.pushState( option );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
  return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
});
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
{% endhighlight %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
Calling [$.bbq.pushState()](http://benalman.com/code/projects/jquery-bbq/docs/files/jquery-ba-bbq-js.html#jQuery.bbq.pushState) will trigger the `hashchange` event. At that point, we can parse the hash from the URL and use it to trigger the proper change in the Isotope instance.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
{% highlight javascript %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
$(window).bind( 'hashchange', function( event ){
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
  // get options object from hash
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
  var hashOptions = $.deparam.fragment();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
  // apply options from hash
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
  $container.isotope( hashOptions );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
})
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
  // trigger hashchange to capture any hash data on init
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
  .trigger('hashchange');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
{% endhighlight %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
Now any filter buttons that are clicked will update the URL hash, so these options can be bookmarked.