<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>(DxD)∞ &#187; JavaScript全般</title>
	<atom:link href="http://dxd8.com/archives/category/javascript/javascript-general/feed/" rel="self" type="application/rss+xml" />
	<link>http://dxd8.com</link>
	<description>Day by Day Infinity - Webな日々(HTML/XHTML/CSS/JavaScript/PHP/CMS)</description>
	<lastBuildDate>Sat, 14 Aug 2010 09:24:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>jQueryのTablesorterを複数行のヘッダに対応させる方法</title>
		<link>http://dxd8.com/archives/118/</link>
		<comments>http://dxd8.com/archives/118/#comments</comments>
		<pubDate>Sat, 10 May 2008 11:56:48 +0000</pubDate>
		<dc:creator>Phize</dc:creator>
				<category><![CDATA[JavaScript全般]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Tablesorter]]></category>
		<category><![CDATA[プラグイン]]></category>

		<guid isPermaLink="false">http://dxd8.com/archives/jquery%e3%81%aetablesorter%e3%82%92%e8%a4%87%e6%95%b0%e8%a1%8c%e3%81%ae%e3%83%98%e3%83%83%e3%83%80%e3%81%ab%e5%af%be%e5%bf%9c%e3%81%95%e3%81%9b%e3%82%8b%e6%96%b9%e6%b3%95/</guid>
		<description><![CDATA[JavaScriptライブラリのjQueryには、テーブルをソートするためのTablesorterというプラグインがあります(デモ)。これを複数行にまたがるヘッダに対応させる方法を紹介します。



複数行のヘッ [...]]]></description>
			<content:encoded><![CDATA[<p>JavaScriptライブラリのjQueryには、テーブルをソートするための<a href="http://plugins.jquery.com/project/tablesorter">Tablesorter</a>というプラグインがあります(<a href="http://tablesorter.com/docs/#Demo">デモ</a>)。これを複数行にまたがるヘッダに対応させる方法を紹介します。</p>

<span id="more-224"></span>

<p>複数行のヘッダというのは、2つ以上のtr要素やrowspan/colspan属性付きのth要素を含むthead要素のことです。Tablesorterの紹介には<q cite="http://plugins.jquery.com/project/tablesorter" title="tablesorter | jQuery Plugins">Support for ROWSPAN and COLSPAN on TH elements</q>とありますが、自動的に対応してくれるわけではないようです(あるいは、将来的にサポート予定なのか)。</p>

<p>解決の糸口となったのは<a href="http://groups.google.com/group/jquery-en">jQueryグループ</a>の「<a href="http://groups.google.com/group/jquery-en/browse_thread/thread/3722414d1411e824/414a5c3cbc7ddc41?lnk=gst&#038;q=+jquery+tablesorter+2.0.1+with+tr+in+thead#414a5c3cbc7ddc41">jquery tablesorter 2.0.1 with tr in thead</a>」というスレッドです。他にも似た質問がいくつか見つかったので、同じようなことで躓いている人は多いようです。</p>

<p>tablesorterオブジェクトにはheaderListというそれっぽいプロパティがあるのですが、上手くいかなかったので今回の方法を採用しました。</p>

<div class="section">
  <h2>前提となる<abbr title="Extensible HyperText Markup Language">XHTML</abbr></h2>
  <p>ここでは、次のような複数行(colspan, rowspan属性付き)のth要素を含むテーブルを例にします。</p>

    <table>
      <caption>製品価格一覧</caption>
      <thead>
        <tr>
          <th scope="col" rowspan="2">製品名</th>
          <th scope="col" colspan="2">価格</th>
        </tr>
        <tr>
          <th scope="col">新規</th>
          <th scope="col">アップグレード</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th scope="row">製品A</th>
          <td class="integer">49800</td>
          <td class="integer">26000</td>
        </tr>
        <tr>
          <th scope="row">製品B</th>
          <td class="integer">39690</td>
          <td class="integer">12390</td>
        </tr>
      </tbody>
    </table>

  <dl class="code">
    <dt>index.html(抜粋)</dt>
    <dd><pre><code class="html">&lt;table&gt;
&nbsp; &lt;caption&gt;製品価格一覧&lt;/caption&gt;
&nbsp; &lt;thead&gt;
&nbsp;   &lt;tr&gt;
&nbsp;     &lt;th scope="col" rowspan="2"&gt;製品名&lt;/th&gt;
&nbsp;     &lt;th scope="col" colspan="2"&gt;価格&lt;/th&gt;
&nbsp;   &lt;/tr&gt;
&nbsp;   &lt;tr&gt;
&nbsp;     &lt;th scope="col"&gt;新規&lt;/th&gt;
&nbsp;     &lt;th scope="col"&gt;アップグレード&lt;/th&gt;
&nbsp;   &lt;/tr&gt;
&nbsp; &lt;/thead&gt;
&nbsp; &lt;tbody&gt;
&nbsp;   &lt;tr&gt;
&nbsp;     &lt;th scope="row"&gt;製品A&lt;/th&gt;
&nbsp;     &lt;td&gt;49800&lt;/td&gt;
&nbsp;     &lt;td&gt;26000&lt;/td&gt;
&nbsp;   &lt;/tr&gt;
&nbsp;   &lt;tr&gt;
&nbsp;     &lt;th scope="row"&gt;製品B&lt;/th&gt;
&nbsp;     &lt;td&gt;39690&lt;/td&gt;
&nbsp;     &lt;td&gt;12390&lt;/td&gt;
&nbsp;   &lt;/tr&gt;
&nbsp; &lt;/tbody&gt;
&lt;/table&gt;</code></pre></dd>
  </dl>
  <p>単純にTablesorterを呼び出すだけでは、このようなテーブルは正しくソートできません。「製品名」・「新規」・「アップグレード」の各th要素をソートのトリガーにしようというのが今回の目的です。</p>
</div>

<div class="section">
  <h2>必要なもの</h2>
  <p>この方法でTablesorterを複数行のヘッダに対応させるには、次のものが必要になります。</p>
  <ul>
    <li><a href="http://docs.jquery.com/Downloading_jQuery">jQuery本体</a></li>
    <li><a href="http://plugins.jquery.com/project/metadata">Metadataプラグイン</a></li>
    <li><a href="http://plugins.jquery.com/project/tablesorter">Tablesorterプラグイン</a></li>
  </ul>
  <p>jQuery本体とTablesorterプラグインはもちろん必要です。Metadataプラグインは、属性値に埋め込んだメタデータ(JavaScriptのオブジェクトリテラルと同じ書式)をオブジェクトに変換してくれるプラグインです。ソートのトリガーとなるth要素を手動で指定するために使います。</p>
</div>

<div class="section">
  <h2>Tablesorterプラグインの修正</h2>
  <p>まず、jquery.tablesorter.js内のbuildHeaders()メソッドを次のコードに入れ替えます。</p>

<dl class="code">
  <dt>jquery.tablesorter.js buildHeaders()メソッド</dt>
  <dd><pre><code class="javascript">function buildHeaders(table) {
&nbsp;   if (table.config.debug) { var time = new Date(); }

&nbsp;   var meta = ($.metadata) ? true : false, tableHeadersRows = [];

&nbsp;   for (var i = 0; i &lt; table.tHead.rows.length; i++) { tableHeadersRows[i]=0; };

&nbsp;   $tableHeaders = $("thead th",table);

&nbsp;   $tableHeaders.each(function(index) {
&nbsp;       var sortIndex;

&nbsp;       if ($.metadata &amp;&amp; $(this).metadata().sortIndex) {
&nbsp;           sortIndex = $(this).metadata().sortIndex;
&nbsp;       } else {
&nbsp;           sortIndex = index;
&nbsp;       }

&nbsp;       this.count = 0;
&nbsp;       this.column = sortIndex;
&nbsp;       this.order = formatSortingOrder(table.config.sortInitialOrder);

&nbsp;       if (checkHeaderMetadata(this) || checkHeaderOptions(table,sortIndex)) this.sortDisabled = true;

&nbsp;       if (!this.sortDisabled) {
&nbsp;           $(this).addClass(table.config.cssHeader);
&nbsp;       }

&nbsp;       // add cell to headerList
&nbsp;       table.config.headerList[sortIndex] = this;
&nbsp;   });

&nbsp;   if (table.config.debug) { benchmark("Built headers:", time); log($tableHeaders); }

&nbsp;   return $tableHeaders;
};</code></pre></dd>
</dl>

  <p>これは、Metadataプラグインを使ったソートインデックスの指定に対応させるものです。</p>
</div>

<div class="section">
  <h2>ソートインデックスの指定</h2>
  <p>Tablesorterを呼び出すためのJavaScriptファイルを作成します(ここではわかりやすいようにベタ書きにします)。</p>
  <p>次に、各th要素に手動でソートインデックスを割り振ります。ソートインデックスは、ソートのトリガーとして使うth要素を指定するためのものです。<abbr title="Extensible HyperText Markup Language">XHTML</abbr>の任意の属性値に<code>{ sortindex: <var>数字</var> }</code>という書式で埋め込みます。</p>
  <p>今回は、ソートインデックスをclass属性として埋め込むことにします。また、直に埋め込むのはよくないので、jQueryを使って動的に埋め込むことにします。</p>

  <p>sortindexにはth要素に対応するテーブルの列を指定します。例えば、<abbr title="Extensible HyperText Markup Language">XHTML</abbr>上で3番目に出現するth要素をテーブルの2列目に関連付けるには、3番目のth要素に<code>{ sortindex: 1 }</code></pre>を指定します(インデックスは0から始まります)。ソートのトリガーとして使わないth要素には、余ったsortindexを指定しておきます。</p>

  <dl class="code">
    <dt>my.js</dt>
    <dd><pre><code class="javascript">$(document).ready(function() {
&nbsp;   // 1番目のth要素: 1列目をソート
&nbsp;   $('table.data thead th:eq(0)').addClass('{ sortIndex: 0 }');

&nbsp;   // 2番目のth要素: 4列目をソート
&nbsp;   // 使わないので余ったインデックスを割り振る
&nbsp;   $('table.data thead th:eq(1)').addClass('{ sortIndex: 3 }');

&nbsp;   // 3番目のth要素: 2列目をソート
&nbsp;   $('table.data thead th:eq(2)').addClass('{ sortIndex: 1 }');

&nbsp;   // 4番目のth要素: 3列目をソート
&nbsp;   $('table.data thead th:eq(3)').addClass('{ sortIndex: 2 }');
});</code></pre></dd>
  </dl>
</div>

<div class="section">
  <h2>Tablesorterの呼び出し</h2>
  <p>続けて、Tablesorterを呼び出します。</p>
  <p>このとき、ソートのトリガーとして使わないth要素(ソートインデックス)には、sorterプロパティにfalseをセットして無効化しておきます。</p>
<dl class="code">
  <dt>my.js</dt>
  <dd><pre><code class="javascript">$(document).ready(function() {
&nbsp;   // 1番目のth要素: 1列目をソート
&nbsp;   $('table.data thead th:eq(0)').addClass('{ sortIndex: 0 }');

&nbsp;   // 2番目のth要素: 4列目をソート
&nbsp;   // 使わないので余ったインデックスを割り振る
&nbsp;   $('table.data thead th:eq(1)').addClass('{ sortIndex: 3 }');

&nbsp;   // 3番目のth要素: 2列目をソート
&nbsp;   $('table.data thead th:eq(2)').addClass('{ sortIndex: 1 }');

&nbsp;   // 4番目のth要素: 3列目をソート
&nbsp;   $('table.data thead th:eq(3)').addClass('{ sortIndex: 2 }');

&nbsp;   $('table.data').tablesorter({
&nbsp;       headers: {
&nbsp;           3: { sorter: false }  // 2番目のth要素: 4列目のソートを無効化
&nbsp;       }
&nbsp;   });
});</code></pre></dd>
</dl>
</div>

<div class="section">
  <h2>JavaScriptファイルへのリンク</h2>
  <p>後は、<abbr title="Extensible HyperText Markup Language">XHTML</abbr>のhead要素内でJavaScriptファイルを読み込ませれば完成です。</p>
  <dl class="code">
    <dt>index.html(抜粋)</dt>
    <dd><pre><code class="html">&lt;script src="jquery.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="jquery.metadata.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="jquery.tablesorter.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="my.js" type="text/javascript"&gt;&lt;/script&gt;</code></pre></dd>
  </dl>
</div>

<p>これで、複雑な表組みの場合にもTablesorterが使えるようになりました。便利です :D</p>

	タグ: <a href="http://dxd8.com/archives/tag/javascript/" title="JavaScript" rel="tag">JavaScript</a>, <a href="http://dxd8.com/archives/tag/jquery/" title="jQuery" rel="tag">jQuery</a>, <a href="http://dxd8.com/archives/tag/tablesorter/" title="Tablesorter" rel="tag">Tablesorter</a>, <a href="http://dxd8.com/archives/tag/%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3/" title="プラグイン" rel="tag">プラグイン</a><br />

	<h2>関連する記事</h2>
	<ul class="st-related-posts">
	<li><a href="http://dxd8.com/archives/81/" title="JavaScript 第5版 - 9章 クラスとコンストラクタとプロトタイプ(1) (2008年3月8日)">JavaScript 第5版 - 9章 クラスとコンストラクタとプロトタイプ(1)</a> (0)</li>
	<li><a href="http://dxd8.com/archives/39/" title="JavaScript 第5版 - 1章 JavaScriptの概要 (2008年1月26日)">JavaScript 第5版 - 1章 JavaScriptの概要</a> (0)</li>
	<li><a href="http://dxd8.com/archives/73/" title="JavaScript 第5版 - 8章 関数(1) (2008年2月29日)">JavaScript 第5版 - 8章 関数(1)</a> (0)</li>
	<li><a href="http://dxd8.com/archives/44/" title="JavaScript 第5版 - 3章 データ型と値(3) (2008年1月31日)">JavaScript 第5版 - 3章 データ型と値(3)</a> (0)</li>
	<li><a href="http://dxd8.com/archives/94/" title="JavaScript 第5版を読み終えて (2008年3月21日)">JavaScript 第5版を読み終えて</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://dxd8.com/archives/118/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JavaScriptライブラリ、jQueryの日本語リファレンス</title>
		<link>http://dxd8.com/archives/98/</link>
		<comments>http://dxd8.com/archives/98/#comments</comments>
		<pubDate>Wed, 26 Mar 2008 00:00:27 +0000</pubDate>
		<dc:creator>Phize</dc:creator>
				<category><![CDATA[JavaScript全般]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[リファレンス]]></category>

		<guid isPermaLink="false">http://dxd8.com/archives/98/</guid>
		<description><![CDATA[JavaScriptライブラリ、jQueryの日本語リファレンスが公開されています。



「jQuery日本語リファレンス」では、jQueryのメソッドが機能別・アルファベット順にまとめられています。掲載されて [...]]]></description>
			<content:encoded><![CDATA[<p>JavaScriptライブラリ、jQueryの日本語リファレンスが公開されています。</p>

<span id="more-187"></span>

<p>「<a href="http://semooh.jp/jquery/">jQuery日本語リファレンス</a>」では、jQueryのメソッドが機能別・アルファベット順にまとめられています。掲載されているのは、メソッドの説明、引数、戻り値、サンプルなどです。</p>

<ul class="figure">
  <li><a href="http://dxd8.com/wp-content/uploads/jquery_reference.png"><img src="http://dxd8.com/wp-content/uploads/jquery_reference.thumbnail.png" width="120" height="128" alt="画像: jQuery日本語リファレンス" /></a></li>
</ul>

<p><a href="http://docs.jquery.com/Main_Page">本家のドキュメント</a>はすっきりとまとまっていて、非常に見やすいと思います。デモを見てコードを見れば、すぐに使い方がわかります。反対に、やりたいことからメソッドを探す場合には、こういった日本語のリファレンスが探しやすいですね。</p>

<p>マスコットキャラクターのせむーちゃんと、「jQuery does not mean Japanese Query...」のコピーが洒落てます :)</p>

	タグ: <a href="http://dxd8.com/archives/tag/javascript/" title="JavaScript" rel="tag">JavaScript</a>, <a href="http://dxd8.com/archives/tag/jquery/" title="jQuery" rel="tag">jQuery</a>, <a href="http://dxd8.com/archives/tag/%e3%83%aa%e3%83%95%e3%82%a1%e3%83%ac%e3%83%b3%e3%82%b9/" title="リファレンス" rel="tag">リファレンス</a><br />

	<h2>関連する記事</h2>
	<ul class="st-related-posts">
	<li><a href="http://dxd8.com/archives/36/" title="オライリー・ジャパンのJavaScript 第5版を読んでいきます (2008年1月23日)">オライリー・ジャパンのJavaScript 第5版を読んでいきます</a> (0)</li>
	<li><a href="http://dxd8.com/archives/58/" title="JavaScript 第5版 - 5章 式と演算子(2) (2008年2月14日)">JavaScript 第5版 - 5章 式と演算子(2)</a> (0)</li>
	<li><a href="http://dxd8.com/archives/82/" title="図解でわかるJavaScriptのプロトタイプチェーン (2008年3月9日)">図解でわかるJavaScriptのプロトタイプチェーン</a> (0)</li>
	<li><a href="http://dxd8.com/archives/35/" title="スライドするコンテンツがアクセシブルなサイト (2008年1月22日)">スライドするコンテンツがアクセシブルなサイト</a> (0)</li>
	<li><a href="http://dxd8.com/archives/63/" title="JavaScript 第5版 - 6章 文(2) (2008年2月19日)">JavaScript 第5版 - 6章 文(2)</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://dxd8.com/archives/98/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>図解でわかるJavaScriptのプロトタイプチェーン</title>
		<link>http://dxd8.com/archives/82/</link>
		<comments>http://dxd8.com/archives/82/#comments</comments>
		<pubDate>Sun, 09 Mar 2008 00:00:46 +0000</pubDate>
		<dc:creator>Phize</dc:creator>
				<category><![CDATA[JavaScript全般]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[オブジェクト指向プログラミング]]></category>
		<category><![CDATA[プロトタイプチェーン]]></category>

		<guid isPermaLink="false">http://dxd8.com/archives/82/</guid>
		<description><![CDATA[「JavaScript 第5版 - 9章 クラスとコンストラクタとプロトタイプ(1)」で、「プロトタイプ(オブジェクト)」と「prototype(オブジェクト)」が別物であることを補足しました。プロトタイプとprotot [...]]]></description>
			<content:encoded><![CDATA[<p>「<a href="http://dxd8.com/archives/81/">JavaScript 第5版 - 9章 クラスとコンストラクタとプロトタイプ(1)</a>」で、「プロトタイプ(オブジェクト)」と「prototype(オブジェクト)」が別物であることを補足しました。プロトタイプとprototypeの違い、プロタイプチェーンについて、わかりやすく図解で解説されているものがあったので紹介しておきます。</p>

<span id="more-151"></span>

<dl>
  <dt><a href="http://ishikawa.arielworks.com/memo/2005/12/31/191810">指向性メモ::2005-12-31::EcmaScriptのプロトタイプチェインを視覚的に</a></dt>
  <dd>もっともシンプルなプロトタイプチェーンの図解。基底クラスに当たるコンストラクタ関数とインスタンスの関係に絞っています。</dd>
  <dt><a href="http://d.hatena.ne.jp/guccyon/20071109/name">__proto__とprototypeについて - guccyonikki</a></dt>
  <dd>JavaScript 第5版の9章で解説されている内容がほぼそのまま一枚の画像に収められています。コンストラクタ関数とインスタンス、プロパティ、プロトタイプの関係性がわかりやすいです。</dd>
  <dt><a href="http://igeta.cocolog-nifty.com/blog/2007/04/prototype.html">いげ太のブログ: プロトタイプチェーンの図とか</a></dt>
  <dd>基底クラスと派生クラスに当たるコンストラクタ関数、インスタンスのプロトタイプチェーンの図。プロトタイプチェーンによる継承の概念を理解するだけなら一番わかりやすいです。</dd>
  <dt><a href="http://ema.fsr.jp/20080121.html">ema log - prototype と __proto__ と constructor , Property Accessor とメソッド呼び出し , JavaScript における mix-in</a></dt>
  <dd>constructor、prototype、プロトタイプの違いと__proto__プロパティの操作、継承の図解。応用についてわかりやすくまとめられています。</dd>
</dl>

<p>コンストラクタ関数とインスタンス、prototypeオブジェクト、プロトタイプオブジェクトの関係性が理解できると、それほど複雑ではないことがわかります。ただ、込み入ってくると混乱する可能性があるので、後で自分でも図にまとめてみようかと思います。</p>

	タグ: <a href="http://dxd8.com/archives/tag/javascript/" title="JavaScript" rel="tag">JavaScript</a>, <a href="http://dxd8.com/archives/tag/%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0/" title="オブジェクト指向プログラミング" rel="tag">オブジェクト指向プログラミング</a>, <a href="http://dxd8.com/archives/tag/%e3%83%97%e3%83%ad%e3%83%88%e3%82%bf%e3%82%a4%e3%83%97%e3%83%81%e3%82%a7%e3%83%bc%e3%83%b3/" title="プロトタイプチェーン" rel="tag">プロトタイプチェーン</a><br />

	<h2>関連する記事</h2>
	<ul class="st-related-posts">
	<li><a href="http://dxd8.com/archives/83/" title="JavaScript 第5版 - 9章 クラスとコンストラクタとプロトタイプ(2) (2008年3月10日)">JavaScript 第5版 - 9章 クラスとコンストラクタとプロトタイプ(2)</a> (0)</li>
	<li><a href="http://dxd8.com/archives/74/" title="JavaScript 第5版 - 8章 関数(2) (2008年3月1日)">JavaScript 第5版 - 8章 関数(2)</a> (0)</li>
	<li><a href="http://dxd8.com/archives/92/" title="JavaScript 第5版 - 11章 正規表現パターンマッチング (2008年3月19日)">JavaScript 第5版 - 11章 正規表現パターンマッチング</a> (0)</li>
	<li><a href="http://dxd8.com/archives/67/" title="JavaScript 第5版 - 7章 オブジェクトと配列(2) (2008年2月23日)">JavaScript 第5版 - 7章 オブジェクトと配列(2)</a> (0)</li>
	<li><a href="http://dxd8.com/archives/68/" title="JavaScript 第5版 - 7章 オブジェクトと配列(3) (2008年2月24日)">JavaScript 第5版 - 7章 オブジェクトと配列(3)</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://dxd8.com/archives/82/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
