enmi12/glossaire/_posts/docs/2010-12-07-sorting.mdown
author ymh <ymh.work@gmail.com>
Wed, 06 Nov 2013 03:21:17 +0000
changeset 0 d970ebf37754
permissions -rwxr-xr-x
first import
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: Sorting
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: getSortData option, anchor: getsortdata_option }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
  - { title: sortBy option, anchor: sortby_option }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
  - { title: sortAscending option, anchor: sortascending_option }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
  - { title: Creating interactive buttons, anchor: creating_interactive_buttons }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
---
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
Collect data from item element and rearrange their order in the layout with sorting.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
[**See Demo: Sorting**](../demos/sorting.html)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
## Markup
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
Any group of similar items have their own data. It could be a text value, like a title or tag, or a numerical value, like a measurement or grade. For our example, each item element has several data points that can be used for sorting. There's the elemental symbol, number, name of the element, weight, and category.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
{% highlight html %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
<div id="container">
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
  <div class="element transition metal" data-category="transition"> 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    <p class="number">79</p> 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    <h3 class="symbol">Au</h3> 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    <h2 class="name">Gold</h2> 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
    <p class="weight">196.966569</p> 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
  </div> 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
  <div class="element metalloid" data-category="metalloid"> 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    <p class="number">51</p> 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
    <h3 class="symbol">Sb</h3> 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    <h2 class="name">Antimony</h2> 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    <p class="weight">121.76</p> 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
  </div>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
</div>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
{% endhighlight %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
## getSortData option
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
In order to extract this data from the element, we need to pass in a function to get it via the [`getSortData`](options.html#getsortdata) option.  This option accepts an object, whose values are the functions to extract the data.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
Each function receives one argument, which represents a jQuery object for each item element. With that argument, the function needs to return the data point.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
In the example above, to get element name, we would need to get the text from the `.name` element. The same works for symbol.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
{% highlight javascript %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
$('#container').isotope({
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
  getSortData : {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
    name : function ( $elem ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
      return $elem.find('.name').text();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
    },
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
    symbol : function ( $elem ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
      return $elem.find('.symbol').text();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
  }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
});
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
{% endhighlight %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
For numerical data, we can convert a text value into a number with `parseInt()` or `parseFloat()`.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
{% highlight javascript %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
getSortData : {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
  // ...
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
  number : function ( $elem ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
    return parseInt( $elem.find('.number').text(), 10 );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
  },
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
  weight : function ( $elem ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
    return parseFloat( $elem.find('.weight').text() );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
  }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
{% endhighlight %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
The data extracted can be anything accessible in the item element via jQuery. To extract the category data held within the `data-category` attribute, we can use the `.attr()`.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
{% highlight javascript %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
getSortData : {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
  // ...
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
  category : function ( $elem ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
    return $elem.attr('data-category');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
  }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
{% endhighlight %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
Get creative! You could sort a list by the width of each item element.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
{% highlight javascript %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
getSortData : {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
  // ...
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
  width : function( $elem ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
    return $elem.width();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
  }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
{% endhighlight %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
## sortBy option
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
For every method set in `getSortData`, Isotope uses that method to build the data for sorting. The data cache is built on initialization so it can be quickly accessed when sorting. With the methods above, we have built data for an item elements name, symbol, number, weight and category.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
Sorting elements is done with the [`sortBy` option](options.html#sortby). The value needs to match the property name used in the `getSortData` object.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
With our example, we can use `'name'`, `'symbol'`, `'number'`, `'weight'` and `'category'`.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
{% highlight javascript %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
$('#container').isotope({ sortBy : 'symbol' });
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
{% endhighlight %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
There are two additional sorting data methods built in to Isotope. 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
+ `'original-order'` will use the original order of the item elements to arrange them in the layout.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
+ `'random'` is a random order.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
## sortAscending option
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
By default, Isotope sorts data in ascension. If our data for name is "Gold, Antimony, Lead, Iron, Silver", when sorted by name, the elements will be ordered ABC.. : "Antimony, Gold, Iron, Lead, Silver."  To reverse the order and sort data in descension, set [`sortAscending`](options.html#sortascending) to <code><span class="kc">false</span></code>.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
{% highlight javascript %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
$('#container').isotope({ 
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
  sortBy : 'name',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
  sortAscending : false
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
});
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
{% endhighlight %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
## Creating interactive buttons
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
We can use a simple list for our buttons.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
{% highlight html %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
<ul id="sort-by">
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
  <li><a href="#name">name</a></li>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
  <li><a href="#symbol">symbol</a></li>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
  <li><a href="#number">number</a></li>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
  <li><a href="#weight">weight</a></li>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
  <li><a href="#category">category</a></li>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
</ul>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
{% endhighlight %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
When one of these links is clicked, we can use the `href` attribute as the value for `sortBy` in the Isotope script.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
{% highlight javascript %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
$('#sort-by a').click(function(){
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
  // get href attribute, minus the '#'
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
  var sortName = $(this).attr('href').slice(1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
  $('#container').isotope({ sortBy : sortName });
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
  return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
});
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
{% endhighlight %}