他ページなどのコンテンツを動的に表示するAJAXもjQueryを使えば驚くほど簡単に利用することができます。今回はAJAXを利用して、
RSS
普段の情報収集でRSSリーダーを使っている方は多いと思いますが、
XML?

RSSはXML
また、
<?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>5509(+1)</title>
<atom:link href="http://moto-mono.net/feed" rel="self" type="application/rss+xml" />
<link>http://moto-mono.net</link>
<description>Output the knowledge</description>
<lastBuildDate>Sun, 28 Feb 2010 05:18:47 +0000</lastBuildDate>
<generator>http://wordpress.org/?v=2.8.1</generator>
<language>ja</language>
<sy:updatePeriod>hourly</sy:updatePeriod>
<sy:updateFrequency>1</sy:updateFrequency>
<item>
<title>コーダー向け勉強会「.coder」の開催が決定しました</title>
<link>http://moto-mono.net/2010/02/22/dotcoder_session1.html</link>
<comments>http://moto-mono.net/2010/02/22/dotcoder_session1.html#comments</comments>
<pubDate>Mon, 22 Feb 2010 10:24:34 +0000</pubDate>
<dc:creator>nori</dc:creator>
<category><![CDATA[WebDev]]></category>
<guid isPermaLink="false">http://moto-mono.net/?p=2205</guid>
<description><![CDATA[内容]]></content:encoded>
<wfw:commentRss>http://moto-mono.net/2010/02/22/dotcoder_session1.html/feed</wfw:commentRss>
<slash:comments>0</slash:comments>
</item>
</channel>
</rss>
XMLもjQueryで要素を取得できる
XHTMLはXML互換を目指したHTMLですが、
例えば記事は、
何がいいたいかと言うと、
var URL = $('link','item').text();
HTML要素の取得とまったく同じですね。この事は今回とても重要なことなので、
jQueryでAJAX
AJAX
最近ではAJAXのWebアプリもかなり多いので、
AJAXの制約
AJAXは一見便利なようですが、
$.ajax()メソッド
今回AJAX通信を実現するにあたり、
$.ajax({
dataType: 'xml',
url: 'feed/rss2.xml',
success: function(data) {
// 引数で受け取るdataがRSSになる
// ここに実行したい処理を書く
}
});
RSSをリストに表示する
ようやく本題ですが、
仕様は以下の通りです。
- div#rssの中にul要素を入れる
- RSSフィードを取得
- div#rss>ulにフィードから取得したタイトルリンクを追加
- 3を繰り返す
AJAX自体は先に述べた、
jQuery(function($){
// ul要素を入れておく
var rssBlock = $('#rss').append('<ul/>');
// RSSの取得
$.ajax({
// 読み込むデータはXML
dataType: 'xml',
// 読み込みデータのURL
url: 'feed/rss2.xml',
// Ajaxの通信が成功した場合
success: function(data) {
// RSSにitem要素がひとつもなかった場合
if( $('item', data).length<1 ) {
$('ul', rssBlock).append('<li>記事がありません。</li>');
return false;
}
// item毎に・・・
$('item', data).each(function() {
// itemの中のlinkとtitleを抜き出してulに追加する
var item = $(this);
$('ul', rssBlock).append(
$('<li/>').append(
$('<a/>', {
href: $('link', item).text(),
text: $('title', item).text()
})
)
);
});
}
});
});
コード自体はとてもシンプルで単純です。ポイントは2つあり、
success: function(data){
// ここではdataはRSSを意味する
}
コメントの通り、
$('link', item).text()
$('title', item).text()
で、
実行結果を見てみましょう。
今回のコードで、
答えは以下の部分です。
$('<a/>', {
href: $('link', item).text(),
text: $('title', item).text()
})
ここは今まであれば、
$('<a/>')
.attr('href',$('link', item).text();
.text($('title', item).text());
これがjQuery1.
プラグイン化
RSS2.
(function($){
// Extend the jQuery fn namespace
$.fn.extend({
// RSS2Render
rss2render: function(options) {
// 今回使う変数たち
var self = $(this),
c = $.extend({
url: null,
number: 10
}, options || {});
// URLがなければ処理を終了する
if( !c.url ) {
return false;
}
// loading文字列とRSSを一覧で表示するためのul要素を入れておく
self.append(
'<div id="loading">loading...</div>',
'<ul/>'
);
// RSSの取得
$.ajax({
// 読み込むデータはXML
dataType: 'xml',
// 読み込みデータのURL
url: c.url,
// Ajaxの通信が成功した場合
success: function(data) {
// loading文字列を消去
$('#loading', self).remove();
// RSSにitem要素がひとつもなかった場合
if( $('item', data).length<1 ) {
$('ul', self).append('<li>記事がありません。</li>');
return false;
}
// item毎に・・・
$('item', data).each(function(i) {
// 指定した数を超えた場合は終了する
if( i > (c.number - 1) ) {
return false;
}
// itemの中のlinkとtitleを抜き出してulに追加する
var item = $(this);
$('ul', self).append(
$('<li/>').append(
$('<a/>', {
href: $('link', item).text(),
text: $('title', item).text()
})
)
);
});
}
});
}
});
})(jQuery);
実行する場合は以下のように実行します。
jQuery(function($){
$('#rss').rss2render({
url: 'feed/rss2.xml',
number: 5
});
});
変更点
プラグインにした際の変更点は
- URLや表示件数はrss2renderのオプションで指定できる
- 読み込みが完了するまでloadingテキストを表示
の2点です。
プラグインの定義方法
また今回はプラグインの定義方法をいつもとは違う方法にしてみました。
$.fn.rss2render = function() {
// 処理
}
$.fn.extend({
rss2render: function() {
// 処理
}
});
上記の2つは書き方が違うだけで、
オプション
実行するときに
jQuery(function($){
$('#rss').rss2render({
url: 'feed/rss2.xml',
number: 5
});
});
のように、
オプションの定義方法もとても簡単で、
var c = $.extend({
url: null,
number: 10
}, options || {});
変数cがオプションで、
ただし、
// URLがなければ処理を終了する
if( !c.url ) {
return false;
}
loading中はテキストを表示する
まず初期化のタイミングで以下のように<div id="loading">loading...</div>
を入れておきます。
// loading文字列とRSSを一覧で表示するためのul要素を入れておく
self.append(
'<div id="loading">loading...</div>',
'<ul/>'
);
$.ajax()が成功したら、
success: function(data) {
// loading文字列を消去
$('#loading', self).remove();
オプションで指定した数を超えた場合終了する
さらに、
$('item', data).each(function(i) {
// 処理が繰り返される毎に i は ++ され 1ずつ増えていく
});
このiを利用して、
$('item', data).each(function(i) {
// 指定した数を超えた場合は終了する
if( i > (c.number - 1) ) {
return false;
}
});
以上でプラグイン化まで出来ました。完成サンプルを確認してみてください。表示件数は5件にしています。