プログラムから開閉パネルを展開する方法

こんにちは。
中の人Bです。

jQueryMobile(以降、jQMと書きます)で便利に使えるコンポーネントの一つに、開閉パネルがあります。これを何かのイベントが発生したタイミング(例えば、ページが読み込まれたタイミング)で、開きたい、と言うことがあります。

これをやろうとして、本家のサイト(http://jquerymobile.com/demos/1.0.1/)や、翻訳サイト(http://dev.screw-axis.com/doc/jquery_mobile/)などを見たのですが、情報がなくて、困り果てたので、ここにその実装の方法を書こうと思います。

今回のサンプルでは、ページを2つ用意します。idをindexとhogeとします。
画面イメージはこんな感じです。普通にマークアップしただけだと、[Tap Me]ボタンをタップして、hogeページを開くだけのものです。


このマークアップは、こんな感じです。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Sample</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name = "format-detection" content = "telephone=no">
    <link rel="stylesheet" href="http://code.jquery.com/mobile/1.0.1/jquery.mobile-1.0.1.min.css" />
    <script src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
    <script src="http://code.jquery.com/mobile/1.0.1/jquery.mobile-1.0.1.min.js"></script>
    <script src="hoge.js"></script><!-- このファイルは、別途用意します-->
</head>

<body>
    <div data-role="page" id="index" data-theme="b">
        <div data-role="header" data-theme="b">
            <h1><p>indexページのヘッダ</p></h1>
        </div>
        <div data-role="content">
            <a href="#hoge" data-role="button">Tap me</a>
        </div>
        <div data-role="footer" data-theme="b">
            <h1><p>indexページのフッタ</p></h1>
        </div>
    </div>

    <div data-role="page" id="hoge" data-theme="b">
        <div data-role="header" data-theme="b">
            <h1><p>hogeページのヘッダ</p></h1>
        </div>
        <div data-role="content">
            <div id="foo" data-role="collapsible" data-collapsed="true">
                <h1>私は開閉パネルです</h1>
                    <p>
                      タップする度に、開いたり閉じたりします。
                    </p>
            </div>
        </div>
        <div data-role="footer" data-theme="b">
            <h1><p>hogeページのフッタ</p></h1>
        </div>
    </div>


</body>
</html>

hoge.jsにコードを書いて、hogeページが開いたタイミングで、展開パネルが自動的に開くようにします。ドキュメントを読んでも、プログラムから展開パネルの開閉を操作する記述はないのですが、jQMの実装モジュールを読むと、"expand"と言うイベントが定義されています。
実は、それさえ分かれば、何のことはなくて、数行のコードを書くだけです。

hoge.js

$("#hoge").live("pageinit",function(){
    $(function() {
        $("div[data-role*='page']").live('pageshow', function(event, ui) {
            $("#foo").trigger("expand");
        });
    });
});

実は、今回の例では、最初から開いとけば良いじゃん、と言う落ちになるのですが、この実装は、開閉パネルとボタンが複数あって、押されたボタンの種類によって、開くパネルを変えたい、と言うケースへの応用を想定しています。次回(正確には次々回)は、その辺りを書く予定です。

こう言う隠しイベント(隠してるわけじゃないと思いますが)みたいなのが他にも色々ありそうです。自分で見つける楽しみもあるんですけど、時間が無い時は焦ります。

興味の有る方は、http://jquerymobile.com/download/からzipファイルを落として、jquery.mobile-1.0.1.js(minの付いてない方)を読んでみて下さい。
1.0.1は、現時点でのものですので、その時の最新のものを読めば良いと思います。


それでは。

本日は、中の人Bが担当しました。