blog.yusukenakanishi.com

Category : JavaScript

Tuesday, December 8, 2009

jQueryでフィルタリングをしてみる

Demoを見る

大分前にやったやつだけど、ネタが無いので書いておきます(以下に紹介するフィルタリングはfactory.yusukenakanishi.comでも使ってます)。元ネタはこちらにQuick and Easy Filtering with jQuery – Nettuts+。そのままやっても勉強にならないので自分なりに改良を。

HTML

<ul id="list">
    <li><a href="hoge" title="PHP HTML">PHP and HTML/XHTML</a></li>
    <li><a href="hoge" title="PHP">PHP</a></li>
    <li><a href="hoge" title="JavaScript HTML">JavaScript and HTML/XHTML</a></li>
    <li><a href="hoge" title="JavaScript">JavaScript and jQuery</a></li>
    <li><a href="hoge" title="JavaScript CSS">javascript and CSS</a></li>

    // 中略

</ul>

JavaScript

$(function(){
    // フィルタリングのメニュー
    var filteringMenu = '<ul id="filtering"> <li class="selected"><a href="#New">最新の10件<\/a><\/li> <li><a href="#ALL">ALL<\/a><\/li> <li><a href="#HTML">HTML/XHTML<\/a><\/li> <li><a href="#CSS">CSS<\/a><\/li> <li><a href="#JavaScript">JavaScript<\/a><\/li> <li><a href="#jQuery">jQuery<\/a><\/li> <li><a href="#PHP">PHP<\/a><\/li> <\/ul>'
    $('#list').before(filteringMenu);

    // #list liのtitle属性にALLを追加
    $('#list li a').each(function(){
        $(this).attr('title',$(this).attr('title')+' ALL');
    });

    // 最初に10件のみ表示させる
    $('#list li').hide();
    $('#list li:lt(10)').fadeIn('slow').removeClass('odd').filter(':odd').addClass('odd');

    // フィルタリング
    $('#filtering li a').click(function() {
        $('#filtering li').removeClass('selected');
        $(this).parent('li').addClass('selected');
        $('p.notes').remove();

        var filterTitle = $(this).attr('href').replace(/#/, '');

        // Newの場合は最新の10件だけを表示
        if (filterTitle == 'New') {
            $('#list li').hide();
            $('#list li:lt(10)').fadeIn().removeClass('odd').filter(':odd').addClass('odd');
        }
        else {
            // この条件に合うものを表示する
            $('#list li').hide().filter(function () {
                var listTitle = $(this).children('a').attr('title');
                var filterList = listTitle.indexOf(filterTitle);
                if (filterList >= 0) {
                    return filterTitle;
                }
            }).fadeIn().removeClass('odd').filter(':odd').addClass('odd');
            // 該当するものが何も無いときにメッセージを表示する
            if (filterList = $('#list li:visible').length == 0) {
                $('#list').before('<p class="notes">0件:該当するものがありません。<\/p>');
                $('p.notes').hide().fadeIn();
            }
        }
        return false;
    });
});

JavaScriptがOFF環境の時フィルタリングするメニューがあっても何の意味もなさないため、わざとJavaScriptで書き出すようにしています。元ネタではclass属性をフィルタリングしてるんだけど僕は何となくtitle属性に変えました。そして該当するものが無いときは何も無いとメッセージを表示させてます。

ここの書き方ダサいよとかあったら教えてくださいな。

Friday, August 21, 2009

jQueryでRSSを取得しリストで表示

Demoを見る

とある勉強会でnoriさんからjQueryを使ってRSSを取得しXMLをパース、そしてリストで表示させるという夏休みの?宿題があったのでやってみました。自分の中でRSSが同じドメインにある場合とRSSが同じドメインにない場合(JavaScriptはセキュリティの関係上、ドメインが違うファイルを読込む事は出来ない仕様になっています。)を想定して作ってみました。

同じドメインにある場合

Demoで読み込んでいるのはこのxmlファイルです。以下JavaScriptのソースにある$.ajax(options)の詳しい内容についてはjQuery日本語リファレンスなどで確認して下さい。

HTML

//head内にjQueryを
<script type="text/Javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

//body内にリスト表示させる場所を作ってあげる
<div id="list-01">
    <!-- ここにフィードの内容が表示される -->
</div>

JavaScript

$(function(){
        //RSSが同じドメインにある場合
        $.ajax({
            //同じドメインにあるXMLファイルのある場所を指定してあげる
            url: 'rss.xml',
            //非同期通信
            async: true,
            //通信結果をキャッシュしない
            cache: false,
            dataType: "xml",
            success: function(xml){
                $(xml).find('item').each(function(i){
                    if (i == 10) {
                        return false;
                    }
                    var title = $(this).find('title').text();
                    var url = $(this).find('link').text();
                    var date = $(this).find('pubDate').text();
                    //月表示を数字表示に変換する
                    date = dateChanger(date);
                    //idがlist-01の箇所にリストで書き出す
                    $('#list-01').append('<li>' + date + '<a href="' + url + '">' + title + '<\/a><\/li>');
                });
                //idがlist-01にあるliをolで括る
                $('#list-01 li').wrapAll('<ol><\/ol>');
            },
            //エラー表示
            error: function(xml){
                $('#list-01').append('<p>Feedの読み込みに失敗しちゃいました。<\/p>');
            }
        });
        //月表示を数字表示に変換する
        var dateChanger = function(str){
            var mydate = new Date(str);
            yy = mydate.getFullYear();
            mm = mydate.getMonth() + 1;
            dd = mydate.getDate();
            if (mm < 10) { mm = "0" + mm; }
            if (dd < 10) { dd = "0" + dd; }
            datestr = yy + "年" + mm + "月" + dd + "日";
            return datestr;
        };
});

同じドメインにない場合

Demoで読み込んでいるのはこのxmlファイルです。外部RSSなので上記のような形では読み込んで来れません。そこでRSSフィード解析用に使ったのはjFeedというプラグインです。ダウンロードしてきたファイルの中でいるのはjquery.jfeed.jsとproxy.phpの2つ。

※セキュリティの問題上、proxy.phpにURLを埋め込むという従来とは違う方法をとっています。

HTML

//head内にjQueryとjFeedを
<script type="text/Javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript" src="./jquery.jfeed.js"></script>

//body内にリスト表示させる場所を作ってあげる
<div id="list-02">
    <!-- ここにフィードの内容が表示される -->
</div>

JavaScript

$(function(){
//RSSが同じドメインにない場合
    $.getFeed({
        //本来はここにRSSのURLを指定する。僕はセキュリティの問題上proxy.phpにURLを埋め込んだので以下の通りに
        url: 'proxy.php',
        success: function(feed){
            var html = '';
            for(var i = 0; i < feed.items.length && i < 10; i++){
                var item = feed.items[i];
                html += '<li>' + dateChanger(item.updated) + '<a href="' + item.link + '">' + item.title + '<\/a><\/li>';
            }
            $('#list-02').append(html);
            $('#list-02 li').wrapAll('<ol><\/ol>');
        }
    });
    //月表示を数字表示に変換する
    var dateChanger = function(str){
        var mydate = new Date(str);
        yy = mydate.getFullYear();
        mm = mydate.getMonth() + 1;
        dd = mydate.getDate();
        if (mm < 10) { mm = "0" + mm; }
        if (dd < 10) { dd = "0" + dd; }
        datestr = yy + "年" + mm + "月" + dd + "日";
        return datestr;
    };
});

proxy.php

$handle = fopen($_REQUEST['url'], "r");

proxy.phpにURLを埋め込んだ方がセキュリティ上良いようなので僕は上記の部分を下記に。

$handle = fopen('http://labs.yusukenakanishi.com/feed/', "r");

どちらの場合も作ってみると比較的簡単に行くようですね。僕?もちろん出来るまで苦労しました。。rewさんwonderさんのお陰ですー><

Tuesday, August 18, 2009

【TB企画】これまでに使った便利なjQueryプラグイン+α

jquery

ハムさんが企画されている【TB企画】これまでに使った便利なjQueryプラグインというトラックバック企画に乗っかってみます。

便利?なjQueryプラグイン

jQuery UI Tabs
jQuery UI Tabs
タブ用のプラグイン(コレはプラグインっていうのかなぁ?)。
jQuery Cycle Plugin
jQuery Cycle Plugin
動きを付けるプラグイン。別に便利じゃないけど。。
Stylesheet switcher using jQuery
Stylesheet switcher
CSSを切り替えるプラグイン。これぐらい自分で書けって話かもだけど。。
InnerFade with JQuery
InnerFade
テキストや画像を切り替えるプラグイン。これも自分で書けって話かもだけど。。
Galleria
Galleria
画像ギャラリーのプラグイン。
jCarousel
jCarousel
画像をスライドさせるプラグイン。これは便利だと思う。
jQuery.lightpop.js
jQuery.lightpop.js
画像、動画をlightbox風に表示させるプラグイン。

その他はLightbox2ThickBox 3.1Videobox: Lightbox for videosslideViewer 1.1とかですね。Lightboxや画像ギャラリー系が多いような気がします。

最近の自分の傾向

ページ先頭にスルスルっとリンクする動きやロールオーバー、右クリック禁止などなど、サイト全体で使うようなのはyuga.jsとかを使っても良いのですが、自分で書くようにしてます。必要最低限な機能は自分で書いた方が使い勝手が良いですね。以下に例を。

//右クリック禁止
$(function(){
    $(document).bind("contextmenu",function(event){
        return false;
    });
});

//:first-child, :last-childをクラスとして追加
$(function(){
    $('body :first-child').addClass('firstChild');
    $('body :last-child').addClass('lastChild');
});

こんなところです。