シンプルなイベントカレンダーを実装するjQueryプラグイン
ある朝僕は、以下の用件を満たすカレンダープラグインを探していました。
- シンプルなHTMLを吐いてデザインの変更が容易
- コールバック関数である程度処理をイジれる
- 月移動のアニメーションが素人ウケしそう
小一時間色々なプラグインを見ましたが、中々しっくり来るモノが無く、「これは探すより作った方が早そうかなぁ」と思ったので作ってみました。
目次
機能概要
記事の初めで大方出ていますが、主に以下の機能を備えています。
- 月移動時のスライドアニメーション
- 生成するHTMLを包含する要素のclass変更
- イベント追加、月移動などに対応するコールバック関数
- JSON形式でのイベント追加
- イベント用JSONの先読み機能 (月移動時の遅延対策)
- 表示中の月に属さない日付の表示、非表示
ダウンロード
jQuery.calendar [圧縮版] - v1.0.3
※開発版はrewish's jQuery.calendar at master - GitHubに置いています。
- 2010-01-20 - v1.0.3 - addDayコールバックのthis.dayで日を取得できるように変更。
- 2010-01-20 - v1.0.2 - bugfix
- 2009-12-05 - v1.0.1 - bugfix
- 2009-11-05 - v1.0.0 - 公開
動作デモ
導入方法
jQueryプラグインではお馴染み、jQueryを読み込んでからプラグインを読み込む。
<script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="jquery.calendar-min.js"></script>
実際にカレンダーを呼び出すコードは以下のようになります。
jQuery(document).ready(function($) {
// 初期状態でカレンダーを呼び出す
$(expr).calendar();
// オプションを付けて呼び出す
$(expr).calendar({
オプション名: オプション値,
オプション名: オプション値
});
});
オプション
以下のオプションが指定できます。
| オプション名 | オプション値 | 初期値 | 説明 |
|---|---|---|---|
| year | 初期表示する年 | 現在の年 | |
| month | 初期表示する月 | 現在の月 | |
| week | 日曜日から始まる週の配列 | [日, 月, 火, 水, 木, 金, 土] | thead部分 |
| caption | 表示月のキャプション | %Y年%M月 | %Y=年、%M=月に置換 |
| navi | 0=前月、1=次月の配列 | [前の月へ, 次の月へ] | |
| todayLink | 「今日」へのリンク | 今日 [%Y年%M月%D日] | %Y=年、%M=月、%D=日に置換 |
| moveTime | スライドアニメの速度 | 700 | |
| events | イベント(行事)を指定 | イベントを追加 | |
| hideOther | 表示中の月以外の日付を非表示 | false | 非表示にする場合はtrue |
| cssClass | 包含要素のclass | jqueryCalendar | |
| addDay | 日付追加コールバック | addDay | |
| addEvent | イベント追加コールバック | addEvent | |
| beforeMove | 月移動前のコールバック | beforeMove | |
| afterMove | 月移動後のコールバック | afterMove | |
| preloadEvent | イベントデータ先読み | イベントをプリロード |
イベントを追加
イベントを追加するには、オプションeventsに連想配列を渡します。
addEventコールバック関数をデフォルトの状態で使用する場合は、以下のような書式になります。
$(expr).calendar({
events: {
// 月と日はゼロパディングしてもしなくてもOK
'2009-10-01': {
title: 'titleを指定すると、指定した文字列がtitle属性に挿入される',
url: 'urlを指定した場合リンクになる'
},
'2009-10-2': {
title: 'titleを指定すると、指定した文字列がtitle属性に挿入される',
url: 'urlを指定した場合リンクになる'
}
}
});
addEventコールバック関数を使って独自の処理にする場合は、連想配列の内容に制限はありません。
$(expr).calendar({
events: {
'2009-10-01': {
hoge: 'addEventの第二引数で受け取れる (evt.hoge など)'
}
}
});
詳しくはコールバック関数 - addEvent参照して下さい。
コールバック関数
addDay
表示月の日付セルを追加する際に呼ばれる関数。
- 実行するタイミング
- 日付セル追加時
- 第一引数
- 日付セル(td)のjQueryオブジェクト
this.dayで日(day)を取得できます。これはtd.text()の戻り値と同じ値です。
$(expr).calendar({
addDay: function(td) {
// 日付の後ろに「日」を付ける (例: 10日)
td.text(td.text() + '日');
// 上記と下記の結果は同じ
td.text(this.day + '日');
}
});
addEvent
イベント(行事)を追加する際に呼ばれる関数。
- 実行するタイミング
- イベント(行事)追加時
- 第一引数
- 日付セル(td)のjQueryオブジェクト
- 第二引数
- eventsオプションで指定したイベント
第二引数にはeventsで指定した日付の内容がそのまま渡される。イベントを追加の例では連想配列を渡しています。
$(expr).calendar({
// 以下は初期値
addEvent: function(td, evt) {
var elem = typeof evt.url != 'undefined'
? $('<a />').attr('href', evt.url)
: $('<span />');
if (evt.id) {
elem.attr('id', 'event-' + evt.id);
}
if (evt.title) {
elem.attr('title', evt.title);
}
elem.text(td.text());
td.text('').append(elem).addClass('event');
}
});
beforeMove & afterMove
月移動前後に呼ばれる関数。
- 実行するタイミング
- 月移動前後
- 第一引数
- 全オプションの連想配列
- 第二引数
- 移動する年
- 第三引数
- 移動する月
$(expr).calendar({
// 月移動前に次のイベントをセット
beforeMove: function(option, year, month) {
// /hoge/YYYYMM からJSONを取得
$.getJson('/hoge/' + year + month, function(json) {
option.events = json;
});
}
});
preloadEventがあるので使用用途が微妙。
イベントをプリロード
イベントデータを月ごとに読み込む場合、月移動時にAjaxなどでイベントデータを読み込むと遅延が発生するので、プリロード(先読み)機能を用意しました。
- 実行するタイミング
- カレンダーを表示した直後
- 第一引数
- 表示している年
- 第二引数
- 表示している月
使用方法
オプションpreloadEventに関数を定義して、以下のようにイベントデータをreturnして下さい。
$(expr).calendar({
preloadEvent: function(year, month) {
// 表示月が2009年10月の場合
:
: AjaxでJSONを読み込むなど
:
return {
'2009-09-1': {
title: '前月のイベント'
},
'2009-11-1': {
title: '次月のイベント'
}
}
}
});
この場合、前月と次月のイベントを含むデータをreturnしなければなりません。
イベントデータが多い場合は、前月と次月を分けて記述することも出来ます。
$(expr).calendar({
preloadEvent: function(year, month) {
// 表示月が2009年10月の場合
:
: AjaxでJSONを読み込むなど
:
return {
// 前月のデータはprevの中に
prev: {
'2009-09-1': {
title: '前月のイベント'
}
},
// 次月のデータはnextの中に
next: {
'2009-11-1': {
title: '次月のイベント'
}
}
}
}
});
イベント追加の処理が少なくなるので、少しだけ速くなります。
いつになったらこんなにすごいのをサラッと書けるんだろうか。。ソース見て勉強します><
残念ながら凄くは無いですが、ソースを読むのは良いことだと思います。
解らないところがあれば答えます。頑張って下さい :)
先ほど、デモ版で今日というリンクを押すと2009年の1月のカレンダーにとびました。
ご報告ありがとうございます。
修正版を公開しました。
質問です。カレンダーの日付を押すと、テキストエリアにその日付が入るようにしたいのですが、どこを触ったらevent処理みたいにHTMLタグが入るのかわかりません><
H&Mさん、こんにちは。
日付をクリックした時に、任意の処理を実行したい場合は、addDayと言うコールバック関数を使います。
以下のページに簡単な例を書いておきましたので、参考にしてみて下さい :)
http://gist.github.com/319205
ありがとうございます。例を参考に作ってみます♪しかしソースを理解するのが、大変ですね・・・
ぜひ使ってみたいと思い、試行錯誤しているのですが、どうしてもうまく動かないので質問させていただきます。
H&Mさんに良く似ているのですが、日付すべてにリンクを張ってをクリックしたら、特定のページ[ページはexample.htmlで固定]へ(example.html?yera=XXXX&month=XX&day=XX)というように日付をGETで渡したいのですが・・・。
ただ、月移動のアニメーションは残したいのです・・・。
これはすごい!と思って発見してぜひ、スケジューラーやブログに連携してみたいのですが。。。。
お手数とは思いますが、どうぞよろしくお願い致します。
lagnさん、こんにちは。
ご提示いただいた処理も基本的にはH&Mさんの場合と同じ感じで行けます。
また、先ほどaddDayコールバック関数内のthisで、日(day)を取得できるように変更したバージョン(v1.0.3)を公開しましたので、
プラグインを再度ダウンロードしてから、以下のページのスクリプトを参考にしてみて下さい :)
http://gist.github.com/321828
おぉ!ご丁寧な返信、誠にありがとうございます。
さっそく、TRYしてみます。
危うく諦めてFLASH(AC3)でゴリゴリやってしまうところでした・・・。もっとJavaとXMLを勉強しないといけません。PHP+DBで、見た目はFLASH一部装飾という古い人間で非力さを痛感しております・・・。
どうもありがとうございました。まずはお礼を申し上げます。